归并排序(Merge Sort)
原理:采用递归思想,分而治之。将数组从中间分割成两部分数组进行排序,其中左半部分和右半部分又递归式进行分割排序,直到分割后的数组只剩两个元素,再逐级向上返回排序好的结果。
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并排序是一种稳定的排序方法。
逻辑代码
public class MergeSort {
public static void main(String[] args) {
int[] arr = {3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48};
sort(arr,0,arr.length-1);
Utils.printArr(arr);
}
public static void sort(int[] arr, int left, int right) {
if (left >= right) return;
//分成两半
int mid = left + (right - left) / 2;
//左边排序
sort(arr, left, mid);
//右边排序
sort(arr, mid + 1, right);
merge(arr, left, mid + 1, right);
}
public static void merge(int[] arr, int left, int mid, int right) {
int[] temp = new int[right - left + 1];
int i = left;//左边数组开始位置
int j = mid+1;//右边数组开始位置
int k = 0; //新数组开始位置
while (i <= mid && j <= right) {
//如果左边数组当前下标对应值 小于 左边数组当前下标对应值,新数组赋值左边下标当前值,否则赋值右边下标当前值
if (arr[i] <= arr[j]) {
temp[k++] = arr[i++];
} else {
temp[k++] = arr[j++];
}
}
// 把左边剩余的数移入数组
while (i <= mid) temp[k++] = arr[i++];
// 把右边边剩余的数移入数组
while (j <= right) temp[k++] = arr[j++];
// 把新数组中的数覆盖arr数组中的当前排序部分
for (int m = 0; m < temp.length; m++) {
arr[left + m] = temp[m];
}
}
}
2.演示图:
演示图片为转载,转载地址:https://www.runoob.com/w3cnote_genre/algorithm
总结
时间复杂度(平均) | 时间复杂度(最好) | 时间复杂度(最坏) | 空间复杂度 | 稳定性 |
---|---|---|---|---|
O(nlogn | O(nlogn) | O(nlogn) | O(n) | 稳定 |