什么是归并排序呢???
官方解释为——归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
简单来说就是先让一组数单个有序,再对相邻两组数进行排序,以此类推…
还是看图吧,就很容易理解啦~~

代码展示
public class TestMergeSort {
public static void mergeSort(int[] array){
for (int i = 1; i < array.length; i*=2) {
merge(array,i); //递归调用
}
}
/**
* @param array
* @param gap
* 代表每个归并段的数据个数
*/
public static void merge(int[] array,int gap){
int s1 = 0; //start
int e1 = s1+gap-1; //end
int s2 = e1+1;
int e2 = s2+gap-1 > array.length-1 ? array.length-1 : s2+gap-1; //如果大于则为array.length-1;不大于则为s2+gap-1
//空间复杂度为O(n)
int[] tmpArr = new int[array.length]; //存放排好序的数
int i = 0;
while (s2 < array.length){ //肯定有两个归并段
//当两个归并段都有数据的时候
while (s1 <= e1 && s2 <= e2){
if (array[s1] < array[s2]){ //s1小的时候
tmpArr[i++] = array[s1++];
}else {
tmpArr[i++] = array[s2++];
}
}
while (s1 <= e1){
tmpArr[i++] = array[s1++];
}
while (s2 <= e2){
tmpArr[i++] = array[s2++];
}
//确定新的下标
s1 = e2+1;
e1 = s1+gap-1;
s2 = e1+1;
e2 = s2+gap-1 > array.length-1 ? array.length-1 : s2+gap-1;
}
while (s1 < array.length){
tmpArr[i++] = array[s1++];
}
System.arraycopy(tmpArr,0,array,0,tmpArr.length);
}
public static void main(String[] args) {
int[] array = {15,2,35,6,23,11,5};
mergeSort(array);
System.out.println(Arrays.toString(array));
}
}

1854

被折叠的 条评论
为什么被折叠?



