合并排序算法是用分治策略实现对N个元素进行排序的算法。其基本思想是:
将待排序元素分成大小大致相同 的两个子集合,分别 对两个子集合进行排序,最终将排好序的子集合合并成所要求的排好序的集合。
重点:
1.分治的实现
2.合并的实现
分治,就是把整个集合的元素一直除2化分,一直化为到没有两个元素开始合并。
图:
分治的时候比较简单,一直除2递归就行了,合并的时候为了方便就借助另一个变化的数组来接收交换的数组,
合并的时候,两个指标i、j,把值比较小的放入temp数组中,然后放入那个值的那一边的指标自加,继续比较。一直把值合部排完合并为一个数组,然后把temp数组复制回到原来数组就可以进入下一个递归。
完全代码由下:
package myAlgorithms;
public class myMergeSort {
public void mergeSort(int arr[],int low,int high) { if(low<high){ int mid = (low+high)/2; mergeSort(arr, low, mid); mergeSort(arr, mid+1, high); Merge(arr,low,mid,high); snp(arr); } } private void Merge(int[] arr, int low, int mid, int high) { int length = high-low+1; int temp[] = new int[length]; int i = low; int j = mid+1; int c = 0; while(i<=mid && j<=high){ if(arr[i]<arr[j]){ temp[c] = arr[i]; c++; i++; } else{ temp[c] = arr[j]; c++; j++; } } while(i<=mid){ temp[c++] = arr[i]; i++; } while(j<=high){ temp[c++] = arr[j]; j++; } c = 0; for(int t=low;t<=high;t++,c++){ arr[t]=temp[c]; } } public void snp(int[] arrays){ for(int i=0;i<arrays.length;i++){ System.out.print(arrays[i]+" "); } System.out.println(); } public static void main(String[] args){ myMergeSort mg = new myMergeSort(); int[] arr = {3,2,4,1,5,6,8}; mg.mergeSort(arr, 0,arr.length-1); }}