思想:利用的还是分治思想,只不过这次我们把数组以2的倍数划分,然后进行两两合并,划分代码如下:
public static void merge(int[] arr){ for(int i = 1;i<arr.length;i *= 2){ mergeSort(arr,i); } }
合并代码如下:
public static void mergeSort(int[] arr, int gap) { int[] tmp = new int[arr.length]; int index = 0; int start1 = 0; int end1 = start1 + gap - 1; int start2 = end1 + 1; int end2 = (start2 + gap - 1)>=arr.length?arr.length-1:start2+gap-1; while(start2<arr.length){ while(start1<=end1&&start2<=end2){ if(arr[start1]<arr[start2]){ tmp[index++] = arr[start1++]; }else{ tmp[index++] = arr[start2++]; } } while(start1<=end1){ tmp[index++] = arr[start1++]; } while(start2<=end2){ tmp[index++] = arr[start2++]; } start1 = end2+1; end1 = start1 + gap - 1; start2 = end1 + 1; end2 = (start2 + gap - 1)>=arr.length?arr.length-1:start2+gap-1; } while(start1<arr.length){ tmp[index++] = arr[start1++]; } for(int j = 0;j<tmp.length;j++){ arr[j] = tmp[j]; } }
来源:https://www.cnblogs.com/du001011/p/11160875.html