Post

归并排序

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.