原理:
利用分治思想
即先使每个子序列有序,再使得子序列段间有序,将有序的子序列合并,得到完全有序的序列。
“归”:递归,递归将数组对半拆分,直到为单个数的数组组
“并”:合并,将拆分的数组的数据按照升序(降序)再放到一个数组中;
java实现:
public static void mergeSort(int[] array,int low,int high){
if(low == high){
return;
}
int mid = (low+high)/2;
mergeSort(array,0,mid);
mergeSort(array,mid+1,high);
//合并
merge(array,low,mid,high);
}
public static void merge(int[] array,int low,int mid,int high){
int s1 = low;
int s2 = mid+1;
int len = high-low+1;
int[] tmp = new int[len];
int i = 0;
while (s1<=mid && s2<=high){
if(array[s1] < array[s2]){
tmp[i++] = array[s1++];
}else {
tmp[i++] = array[s2++];
}
}
while (s1<=mid){
tmp[i++] = array[s1++];
}
while (s2<=high){
tmp[i++] = array[s2++];
}
for (int j = 0; j <tmp.length ; j++) {
array[j+low] = tmp[j];
}
}
非递归:
public static void mergeSort2(int[] array){
for (int gap = 1; gap <array.length ; gap*=2) {
merge2(array,gap);
}
}
public static void merge2(int[] array,int gap){
int s1 =0;
int e1 = s1+gap-1;
int s2 = e1+1;
int e2 = (s2+gap-1)>=array.length? array.length-1:s2+gap-1;
int[] tmp = new int[array.length];
int i =0;
while (s2<=array.length){
while (s1 <= e1 && s2 <= e2){
if(array[s1] <= array[s2]){
tmp[i++] = array[s1++];
}else {
tmp[i++] = array[s2++];
}
}
while (s1<=e1){
tmp[i++] = array[s1++];
}
while (s2<=e2){
tmp[i++] = array[s2++];
}
s1 = e2+1;
e1 = s1+gap-1;
s2 = e1+1;
e2 = (s2+gap-1)>=array.length?array.length-1:s2+gap-1;
}
while (s1<=array.length-1){
tmp[i++] = array[s1++];
}
for (int j = 0; j <tmp.length ; j++) {
array[j] = tmp[j];
}
}