CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
【经验总结】不能实施并行处理的情况 浅谈并行编程中的任务分解模式
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  新手乐园

如何优化快速排序算法

楼主huigenius(漫步sun)2006-03-31 12:12:00 在 C/C++ / 新手乐园 提问

RT  
  书上说到优化快速排序是修改“一次划分”算法,在指针high减1和low增1的同时进行冒泡操作,同时附设两个布尔型变量分别指示low和high在从两端向中间的移动过程中是否进行过交换记录的操作,若low从低端向中间的移动过程中没有进行交换记录的操作,则不再需要对低端子表进行排序,类似high指针也是如此。  
  这样划分可以进一步改善快速排序的平均性能。  
  对书上的说明不太明白   希望有人可以解释下   有算法或代码说明更好   谢谢 问题点数:100、回复次数:8Top

1 楼ugg(逸学堂(exuetang.net))回复于 2006-03-31 13:01:15 得分 1

一向对算法缺乏研究。  
  帮你upTop

2 楼ChenSu2008(北海沉书)回复于 2006-03-31 13:13:52 得分 27

template   <class   Type>  
  void   QuickSort   (   datalist<Type>   &list,   const   int   left,   const   int   right   )   {  
  //在待排序区间   left&#61566;right   中递归地进行快速排序  
  if   (   left   <   right)   {  
  int   pivotpos   =   Partition   (   list,   left,   right   );   //划分  
  //在左子区间递归进行快速排序  
  QuickSort   (   list,   left,   pivotpos-1);          
   
  //在右子区间递归进行快速排序  
  QuickSort   (   list,   pivotpos+1,   right   );  
   
  }  
  }  
   
  template   <class   Type>  
  int   Partition   (   datalist<Type>   &list,   const   int   low,    
  const   int   high   )   {  
  int   pivotpos   =   low;                                                           //基准位置  
  Element<Type>   pivot   =   list.Vector[low];  
  for   (   int   i   =   low+1;   i   <=   high;   i++   )  
  if   (   list.Vector[i].getKey   (   )   <   pivot.getKey(   )   &&   ++pivotpos   !=   i     )  
  Swap(   list.Vector[pivotpos],   list.Vector[i]   );  
   
  //小于基准对象的交换到区间的左侧去  
  Swap   (   list.Vector[low],   list.Vector[pivotpos]   );  
  return   pivotpos;  
  }  
   
  "在指针high减1和low增1的同时进行冒泡操作"  
  这个不太明白,但是对于后面那点,这个算法已经这样做了。  
  [来源于清华大学-数据结构\C++   描述]Top

3 楼yuanchuang(元创)回复于 2006-03-31 13:48:54 得分 1

我也帮你UPTop

4 楼cyberHunK(→迈克·老猫←)回复于 2006-03-31 14:37:36 得分 50

首先要了解快速排序的缺点,在无序数据中,快速排序有很好的效果。但在对于数据存在有序、反向有序及主次有序的形态时,快速排序都存在引起退化到二次行为的严重缺陷!  
   
  由于这个缺点,你的这个改进算法是在排序的前期进行了数据有序与否的检查,尽量缩短数据交换的次数!而快速排序一种真正的改进算法是单个排序,算法思想如下:(以一把硬币为例)  
   
  1、把硬币倒成一堆;  
  2、检查硬币堆是否已经有序;如果无序,则:  
  3、搅拌硬币并从硬币堆中抓取一些硬币。挑出这批硬币中的中值硬币;  
  4、把面值更大的硬币放在右边的硬币堆;  
  5、把面值更小的硬币放在左边的硬币堆;  
  6、如果硬币对很小,使用折半插入算法,否则:  
  7、对于每一堆硬币,返回步骤2,直到所有硬币全部排序完毕。由于把大面值硬币放在右边,而把小面值硬币放在左边,因而当每堆只有一枚硬币时,所有硬币完全有序。  
   
   
   
  Top

5 楼hbyufan()回复于 2006-04-01 05:19:21 得分 10

提供几个网子去看看,帮顶  
  http://www.stlchina.org/twiki/bin/view.pl/Main/STLSortAlgorithms  
  http://www.gd-emb.org/detail/id-2233.html  
  http://edu.yesky.com/edupxpt/42/2072542.shtmlTop

6 楼wuyinggu(寂寞小阳春)回复于 2006-04-01 23:40:20 得分 10

这是一个快速排序的程序:  
   
  #include<stdio.h>  
   
  void   quick_sort(int   array[],int   first,int   last)//first,last分别为数组下标的范围;  
   
  {  
   
  int   temp,low,high,list_separator;  
   
  low=first;  
   
  high=last;  
   
  /*下面是比较数组中的大小,把数组中的数与中间数比较,大的放在后半部分,比中间数小的放在前半部分,*/  
   
          list_separator=array[(first+last)/2];//中间数;  
   
  do{  
   
                  while(array[low]<list_separator)//中间数与前半部分比较;  
   
                                low++;  
   
                  while(array[high]>list_separator)//   中间数与后半部分比较;  
   
                                high--;  
   
                  if(low<=high)//前半部分与后半部分交换;  
   
                  {  
   
                                temp=array[low];  
   
                                array[low++]=array[high];  
   
                                array[high--]=temp;  
   
                  }  
   
  }while(low<=high);  
   
  if(first<high)  
   
                  quick_sort(array,first,high);//利用递归的办法,实行循环;  
   
  if(low<last)  
   
                  quick_sort(array,low,last);//利用递归的办法,实行循环;  
   
  }  请高手优化!!!  
  Top

7 楼skywoody()回复于 2006-04-02 00:59:36 得分 1

直接用STL的sort多好啊  
  效率比自己写的快排好多了而且可靠Top

8 楼ox_thedarkness()回复于 2006-04-02 01:18:41 得分 0

回楼上的,如果要考试那么还是得自己做...Top

相关问题

  • 快速排序算法,急用在线!!!
  • 散分!最后53分!请写出堆排序和快速排序算法!
  • 请教ASP中如何写快速排序算法?
  • 寻找int[k]数组的快速排序算法
  • 快速排序的递归算法问题?
  • 急!!!!!!怎样用delphi实现快速排序算法???????
  • 十万火急:关于快速排序的算法。
  • 图像颜色快速优化提取算法???
  • 求排序算法~~~~~~~~~~~~!!!
  • 关于快速排序算法中:pivotpos++与++pivotpos的问题(确实很菜)!

关键词

  • 排序
  • 算法
  • low
  • 数组
  • high
  • 比较
  • 部分
  • 操作
  • separator
  • array

得分解答快速导航

  • 帖主:huigenius
  • ugg
  • ChenSu2008
  • yuanchuang
  • cyberHunK
  • hbyufan
  • wuyinggu
  • skywoody

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
惹火投票。。火热进行中...
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
CSDN网站24小时值班电话:13552009689
Copyright © 2000-2009, CSDN.NET, All Rights Reserved
GongshangLogo