问题描述:
通过归并排序,从小到大排序一个数组。
算法实现:
相关变量初始化:
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.依次完成所有递归,数组有序。
来源:https://www.cnblogs.com/heibingtai/p/12585599.html