归并排序
本文采用Java书写选择排序,其他语言类似可以借鉴着写
- 思想1(正着想):将一个大的无序数组有序,我们可以把大的数组等分成两个,然后对这两个数组分别进行排序,之后在把这两个数组合并成一个有序的数组。
- 思想2(反着想):待排序的n个元素,可以看作n个待合并的有序序列,每个序列只有一个元素。每次将两个相邻的序列合并为一个大的有序序列,重复合并过程直到剩下一个序列。两种其实核心思想是一样的只是理解不同。
- 效果图:可以借助动图来理解归并排序

- 效果图2:

算法的复杂度和稳定性
代码实现
package Sort;
public class MergeSort {
public static void mergeSort(int[] arr){
if(arr == null || arr.length < 2){
return;
}
process(arr,0, arr.length-1);
}
public static void process(int[] arr, int L,int R){
if(L == R){
return;
}
int mid = L + ((R-L) >> 1);
process(arr, L, mid);
process(arr, mid + 1, R);
merge(arr, L, mid, R);
}
public static void merge(int[] arr, int L, int M, int R){
int[] help = new int[R-L+1];
int i = 0;
int p1 = L;
int p2 = M + 1;
while (p1 <= M && p2 <= R){
help[i++] = arr[p1] <= arr[p2] ? arr[p1++] : arr[p2++];
}
while (p1 <= M){
help[i++] = arr[p1++];
}
while (p2 <= R){
help[i++] = arr[p2++];
}
for(i = 0; i < help.length; i++){
arr[L+i] = help[i];
}
}
public static void main(String[] args) {
int[] arr = new int[]{9,8,7,6,5,4,3,2,1};
mergeSort(arr);
for(int i:arr){
System.out.println(i);
}
}
}