Chinaunix首页 | 论坛 | 博客
  • 博客访问: 204169
  • 博文数量: 24
  • 博客积分: 608
  • 博客等级: 中士
  • 技术积分: 371
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-22 21:10
文章分类

全部博文(24)

文章存档

2012年(24)

分类: C/C++

2012-09-05 20:27:48

此处不是介绍合并排序原理的,需要说的是,对于自己写排序,特别需要注意其边界,今天就修改边界修改了很久,一方面反映了自己写的还是比较少,另外也和新手们一起学习一下。我写数组有个习惯,可能是看了stl源码剖析的原因,例如这种fun(a, first,last),first指向第一个结点,last指向最后一个结点的下一个结点,但是凡涉及到递归的,以及子程序,这种思想需要统一起来,也就是说不要一个函数调用的是last指向最后一个的下一个,子函数里面却是last指向最后一个,如此会引发不伦不类。

点击(此处)折叠或打开

  1. #include <iostream>
  2. using namespace std;

  3. void print(int *a, int len)
  4. {
  5.     for(int i = 0; i < len; i++)
  6.         cout << a[i] << ' ';
  7.     cout << endl;
  8. }


  9. void merge(int *a, int first, int mid, int last)    //0 2 5
  10. {
  11.     int n1 = mid - first;    //2
  12.     int n2 = last - mid;    //3
  13.     int k = first;            
  14.     int i = 0, j = 0;
  15.     int *a1 = new int[n1];
  16.     int *a2 = new int[n2];
  17.     
  18.     for(int i = 0; i < n1; i++)
  19.         a1[i] = a[first+i];
  20.     for(int i = 0; i < n2; i++)
  21.         a2[i] = a[mid+i];
  22.     
  23.     while(i < n1 && j < n2)
  24.     {
  25.         if(a1[i] <= a2[j])
  26.             a[k++] = a1[i++];
  27.         else
  28.             a[k++] = a2[j++];
  29.     }
  30.     
  31.     while(i < n1)
  32.         a[k++] = a1[i++];
  33.     while(j < n2)
  34.         a[k++] = a2[j++];
  35.     
  36.     delete a1[];
  37.     delete a2[];
  38. }

  39. void mergeSort(int *a, int first, int last)
  40. {
  41.     if(first + 1 < last)
  42.     {
  43.         int mid = (last + first) / 2;
  44.         mergeSort(a, first, mid);
  45.         mergeSort(a, mid, last);
  46.         merge(a, first, mid, last);
  47.     }
  48. }

  49. int main()
  50. {
  51.     int a[] = {3, 1, 5, 4, 2, 7, 3, 9, 13, 6, 15, 0};
  52.     int length = sizeof a / sizeof a[0];
  53.     mergeSort(a, 0, length);
  54.     print(a, length);
  55. }

阅读(1455) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~