基础排序参考
https://blog.csdn.net/yushiyi6453/article/details/76407640
归并排序
归并排序从小到大排序:首先让数组中的每一个数单独成为长度为1的区间,然后两两一组有序合并,得到长度为2的有序区间,依次进行,直到合成整个区间。
代码实现
package sort;
import java.util.Scanner;
/**
* @author 王筱哲
* @Data: 2019/8/1
* @Time: 15:12
*/
public class MergeSort {
/**
* 归并排序
*/
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int[] arr = new int[5];
for (int i = 0; i < arr.length; i++) {
arr[i] = scanner.nextInt();
}
int[] ints = mergeSort(arr, 0, arr.length - 1);
for (int i = 0; i < ints.length; i++) {
System.out.println(arr[i]);
}
}
public static int[] mergeSort(int[] arr, int left, int right) {
if (left == right) {
return arr;
}
int mid = (left + right) / 2;
mergeSort(arr, 0, mid);
mergeSort(arr, mid + 1, right);
mergn(arr, left, mid, right);
return arr;
}
public static void mergn(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++];
}
/**p1没有越界,p2必定越界*/
while (p1 <= m) {
help[i++] = arr[p1++];
}
/**p2没有越界,p1必定越界*/
while (p2 <= r) {
help[i++] = arr[p2++];
}
for (i = 0; i < help.length; i++) {
arr[l + i] = help[i];
}
}
}
平均时间复杂度:O(nlogn) 最坏时间复杂度:O(nlogn) 空间复杂度:O(n) 稳定