归并排序

本文最后更新于:2021年4月17日 晚上

概览:归并排序!

核心思想

2路归并的思想:

将待排序表拆分,直到每个子表的长度为1,然后两两归并,得到n/2个长度为2的有序表。

继续归并,直到合并成为一个长度为n的有序表为止!

代码实现

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
void Merge(vector<int> &num, int left,int mid, int right) {
vector<int> tmpv(num.size());//辅助数组

for (int i = left; i <= right; i++)
tmpv[i] = num[i];//拷贝
int i = 0,j = 0,k = 0;;
for (i = left, j = mid + 1, k = i; i <= mid && j <= right; k++) {
if (tmpv[i] <= tmpv[j])
num[k] = tmpv[i++];
else
num[k] = tmpv[j++];
}

while (i <= mid) num[k++] = tmpv[i++];
while (j <= right) num[k++] = tmpv[j++];
}

void MergeSort(vector<int> &num,int left,int right) {
if (left < right) {
//持续拆分表,直到待排序表长为1
int mid = (left + right) / 2;
MergeSort(num, left, mid);
MergeSort(num, mid, right);
Merge(num, left, mid, right);//归并左边和右边, 逐个缩小,然后最后使用归并合并起来!
}
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!