归并排序

归并排序

  1. 将两个已经排序的数组合并为顺序数组
  2. 如果两个数组没有排序,则使用分治法完成排序
  3. 分治法,将数组不断分为1/2,直到数组元素为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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <iostream>
#include <vector>
using namespace std;

void merge(vector<int>& num, int M, int L, int R)
{
int LEFT_SIZE=M-L;
int RIGHT_SIZE=R-M+1;

vector<int> left;
vector<int> right;

for(int i=L; i<M; ++i)
left.push_back(num[i]);
for(int j=M; j<=R; ++j)
right.push_back(num[j]);

int i=0;
int j=0;
int k=L;
while(i<LEFT_SIZE && j<RIGHT_SIZE)
{
if(left[i]<right[j])
{
num[k]=left[i];
++i;
++k;
}
else
{
num[k]=right[j];
++j;
++k;
}
}

while(i<LEFT_SIZE)
{
num[k]=left[i];
++i;
++k;
}
while(j<RIGHT_SIZE)
{
num[k]=right[j];
++j;
++k;
}
}

void merge_sort(vector<int>& num, int L, int R)
{
if(L==R)
return;
else{
int M=(L+R)/2;

merge_sort(num,L,M);
merge_sort(num,M+1,R);
merge(num,M+1,L,R);
}

}
int main()
{
vector<int> num{2,5,7,9,3,6,8,9};
int L=0;
int R=num.size()-1;
merge_sort(num,L,R);

for(auto c:num)
cout<<c<<" ";
cout<<endl;
return 0;
}
WhitneyLu wechat
Contact me by scanning my public WeChat QR code
0%