当前位置 : 主页 > 编程语言 > java >

【Java -- 算法】十大排序算法之归并排序

来源:互联网 收集:自由互联 发布时间:2022-06-22
简介 归并排序是将两个或两个以上的有序表组合成一个新的有序表。其基本思想是:先将N个数据看成N个长度为1的表,将相邻两个表合并,得到长度为2的N/2个有序表,进一步将相邻的

简介

归并排序是将两个或两个以上的有序表组合成一个新的有序表。其基本思想是:先将N个数据看成N个长度为1的表,将相邻两个表合并,得到长度为2的N/2个有序表,进一步将相邻的表合并,得到长度为4的N/4个有序表,以此类推,知道所有数据合并成一个长度为N的有序表位置。没一次归并称为一趟。

实现方法

归并排序有两种实现方法:

  • 自底向上
  • 自顶向下

自底向上的基本思想是:第一趟归并排序时,将待排序的文件R[1…n]看做是n个长度为1的有序文件,将这些子文件两两归并,若n为偶数,则得到n/2个长度为2的有序文件;若n为奇数,则最后一个子文件轮空(不参与归并,直接进入下一趟归并),估本趟归并完成后,前n/2-1个有序子文件长度为2,单最后一个子文件长度仍未1;第二趟归并则是将第一趟归并所得到的n/2个有序文件两两归并,如此反复,知道得到最后长度为n的有序文件位置。

算法步骤

  • 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
  • 设定两个指针,最初位置分别为两个已经排序序列的起始位置
  • 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
  • 重复步骤3直到某一指针达到序列尾
  • 将另一序列剩下的所有元素直接复制到合并序列尾
    【Java -- 算法】十大排序算法之归并排序_归并排序
  • 实例

    1. Java 代码

    public class Main {
    public static void main(String[] args) {
    int[] sort ={3,2,1,4,6,5,8,9,10,7} ;
    System.out.println("排序前:");
    printArray(sort);
    int[] tmp = new int[sort.length];
    mergeSort(sort,0,sort.length-1,tmp);
    System.out.println("\n排序后:");
    printArray(sort);
    }

    public static void printArray(int[] a) {
    for (int i = 0;i < a.length;i++) {
    System.out.print(a[i]+" ");
    }
    System.out.println();
    }

    public static void mergeSort(int[] data,int first,int last,int[] tmp){
    if(first<last){
    int mid = (last-first)/2+first;
    //使左侧有序
    mergeSort(data,first,mid,tmp);
    //使右侧有序
    mergeSort(data,mid+1,last,tmp);
    //合并两个有序的子序列
    mergeTwo(data, first, mid, last, tmp);
    }
    }

    public static void mergeTwo(int[] data,int first,int mid,int last,int[] tmp) {
    int i = first, j = mid + 1;
    int m = mid, n = last;
    int k = 0;

    while(i <= m && j <= n){

    if(data[i]<data[j]){
    tmp[k++] =data[i++];
    }else{
    //如果B序列值小,就将其移值tmp中
    //并且B下标i+1;tmp下标k+1
    tmp[k++] = data[j++];
    }
    }

    while(i<=m){
    tmp[k++] =data[i++];
    }

    while(j<=n){
    tmp[k++] = data[j++];
    }

    for (i = 0; i < k; i++) {
    data[first + i] = tmp[i];
    }

    }
    }

    2. 输出结果
    【Java -- 算法】十大排序算法之归并排序_归并排序_02


    上一篇:【Java -- 算法】十大排序算法之快速排序
    下一篇:没有了
    网友评论