人的知识就好比一个圆圈,圆圈里面是已知的,圆圈外面是未知的。你知道得越多,圆圈也就越大,你不知道的也就越多。

0%

排序--归并排序

概念

采用归并思想/分治法:把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。

时间复杂度

  • 平均:O(nlog(n))
  • 最好:O(nlog(n))
  • 最坏:O(nlog(n))

空间复杂度

O(1)

稳定性

稳定

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class MergeSort implements Sort {

@Override
public int[] sort(int[] arr) {
return sort(arr, 0, arr.length - 1);
}

private int[] sort(int[] arr, int l, int h) {
// 递归终止条件,返回单个元素数组
if (l == h) {
return new int[]{arr[l]};
}

// 二等分,分别递归排序
int mid = l + (h - l) / 2;
int[] leftArr = sort(arr, l, mid);
int[] rightArr = sort(arr, mid + 1, h);

int[] newArr = new int[leftArr.length + rightArr.length];

int m = 0, i = 0, j = 0;
while (i < leftArr.length && j < rightArr.length) {
newArr[m++] = leftArr[i] < rightArr[j] ? leftArr[i++] : rightArr[j++];
}

while (i < leftArr.length) {
newArr[m++] = leftArr[i++];
}

while (j < rightArr.length) {
newArr[m++] = rightArr[j++];
}

return newArr;
}
}
小礼物走一走,来 Github 关注我