归并排序
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
void merge_sort(int a[], int l, int r){
//递归结束条件
if(l>=r){return;}
int mid=(l+r)>>1;//取中间元素为划分界限
int i=l; int j=mid+1;
//递归调用
merge_sort(a,l,mid);
merge_sort(a,mid+1,r);
int temp[N];//临时数组,用于保存两个子数组二路归并后得到的有序版母数组
int k=0;//用来遍历临时数组的指针
//若两路都没遍历完,谁大接谁
while(i<=mid&&j<=r){
if(a[i]<a[j]){
temp[k]=a[i];
i++;k++;
}else{
temp[k]=a[j];
j++;k++;
}
}
//若有一路遍历完了,把剩下的直接接到后面
while(i<=mid){
temp[k]=a[i];
i++;k++;
}
while(j<=r){
temp[k]=a[j];
j++;k++;
}
//不能用"a=temp"来把临时数组赋值给a数组!!
for (i = l, k = 0; i <= r; i++, k++) {
a[i] = temp[k];
}
}
- 在
merge_sort
函数的合并阶段,你使用了局部变量temp[N]
来存储排序后的结果。这没有问题,但最后你用a = temp
企图将temp
的内容赋值回a
。这是一个 ==浅拷贝==,并不会真正修改a
的内容。
原因:a = temp
只是改变了指针的指向,而不会将 temp
的值拷贝到 a
的对应位置。
This post is licensed under CC BY 4.0 by the author.