Chinaunix首页 | 论坛 | 博客
  • 博客访问: 102790
  • 博文数量: 23
  • 博客积分: 555
  • 博客等级: 中士
  • 技术积分: 320
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-14 11:04
文章分类

全部博文(23)

文章存档

2012年(23)

我的朋友

分类: C/C++

2012-06-08 20:55:54

一,快速排序的主体递归部分字正腔圆,通常随便写一下也不会写出什么大的问题的。

主要要注意的或者说要记住的就是:
1)low < high判定。
2)mid-1和mid+1,即partition之后mid已经在位置了。

如下所示:
  1. void quick_sort(int a[], int low, int high)
  2. {
  3.     if (low < high)
  4.     {
  5.         int mid = partition(a,low,high);

  6.         quick_sort(a,low,mid-1);
  7.         quick_sort(a,mid+1,high);
  8.     }
  9. }

二,重要的是partition部分,即让选定的元素到位。

其中需要注意的点是:(即partition的步骤)
1)选定元素(直接选a[low]);
2)交替扫描的次序:注意先从高端向低端扫描,而后从低端向高端扫描
(当然可以其他方法,需要修改调整代码)
3)i < j的限定,防止i与j的交错出现异常错误。

如下所示:
  1. int partition(int a[], int low, int high)
  2. {
  3.     int cur = a[low];
  4.     int i = low;
  5.     int j = high;
  6.     
  7.     while (i < j)
  8.     {
  9.         while(a[j] >= cur && i < j)
  10.         {
  11.             j--;
  12.         }
  13.         swap(a[i], a[j]);
  14.         // cur跑到右边了
  15.         
  16.         while(a[i] <= cur && i < j)
  17.         {
  18.             i++;
  19.         }
  20.         swap(a[i], a[j]);
  21.         // cur跑到左边了
  22.     }    
  23.     return i;
  24. }
跟踪选定的元素cur可以发现,其最后的位置落在i=j上。
注意到最终i是等于j的,i=j后还做了一次原位swap操作,即swap(a[i],a[i])。

三,进一步的,partition可以不使用swap,只使用赋值。
优化调整的代码如下:
  1. int partition(int a[], int low, int high)
  2. {
  3.     int cur = a[low];
  4.     int i = low;
  5.     int j = high;
  6.     
  7.     while(i < j)
  8.     {
  9.         while(a[j] >= cur && i < j)
  10.         {
  11.             j--;
  12.         }
  13.         a[i] = a[j];
  14.         while (a[i] <= cur && i < j)
  15.         {
  16.             i++;
  17.         }
  18.         a[j] = a[i];
  19.     }
  20.     a[i] = cur;
  21.     return i;
  22. }

四,基本上到这里就行了,不必再进一步的优化了。(枢轴元素的随机化、相邻元素的逆序交换等什么什么的)
阅读(820) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~