归并排序

风流意气都作罢 提交于 2020-03-28 08:18:18

 

问题描述:

通过归并排序,从小到大排序一个数组。

 

算法实现:

  相关变量初始化: 

 int num = 8;

int[] arr = new int[num];
int[] temp = new int[num];算法调用:
mergeSort(arr, 0, arr.length - 1, temp);主要方法:
public void mergeSort(int[] arr, int lo, int hi, int[] temp) {    if(lo >= hi) return;    int mid = lo + (hi - lo) / 2;    mergeSort(arr, lo, mid, temp);    mergeSort(arr, mid + 1, hi, temp);    merge(arr, lo, mid, hi, temp);}private void merge(int[] arr, int lo, int mid, int hi, int[] temp) {    int i = lo;    int j = mid + 1;    for(int k = lo; k <= hi; k++) {        temp[k] = arr[k];    }    for(int k = lo; k <= hi; k++) {        if(i > mid) arr[k] = temp[j++];        else if(j > hi) arr[k] = temp[i++];        else if(less(arr[j], arr[i])) arr[k] = temp[j++];        else arr[k] = temp[i++];    }    System.out.println("merge = " + Arrays.toString(arr));}private boolean less(int a, int b) {    if(a < b) {        return true;    }    return false;}
生成8个随机数测试:
arr = [15, 16, 1, 33, 72, 35, 38, 26]merge = [15, 16, 1, 33, 72, 35, 38, 26]merge = [15, 16, 1, 33, 72, 35, 38, 26]merge = [1, 15, 16, 33, 72, 35, 38, 26]merge = [1, 15, 16, 33, 35, 72, 38, 26]merge = [1, 15, 16, 33, 35, 72, 26, 38]merge = [1, 15, 16, 33, 26, 35, 38, 72]merge = [1, 15, 16, 26, 33, 35, 38, 72]

算法解析:

1.采用“分治”策略,对待排序数组先拆分后合并;

2.找到数组的中间点,左右分别递归,直到不再满足递归条件,然后开始合并;

3.合并需要一个和数组同样大小的临时数组(归并排序是以空间换时间);

4.每次合并,先将待合并的数组赋值到临时数组;

5.比较待合并到数组左右两侧的数组,这时要用到通过中间结点的索引;

6.若左边待遍历的索引已经超过中间索引,则左边数据已经都加入有序数组,此时只需将右边的依次添加完成;

7.若右边待遍历的索引已经超过末端索引,则右边数据已经都加入有序数组,此时只需将左边的依次添加完成;

8.若两边都还有数据,则进行比较,将更小的加入有序数组,对应的索引+1;

9.依次完成所有递归,数组有序。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!