夕拾-数据结构-快速排序
来源:互联网 发布:打开数据连接无法上网 编辑:程序博客网 时间:2024/06/06 08:32
朝花夕拾,很长时间没有弄算法了,可不能荒废,先从数据结构的算法复习,之后在复习诸如图论,数论,贪心之类的算法。
还望君持之以恒,良辰他日必有重谢!
快速排序,在实际应用中算是比较高效的排序算法
具体思想如下:
1.在序列中,选择一个元素作为中枢元素(中枢元素:左边的不比其大,右边的不比其小),一般选择第1个元素即可
2.从右到右扫描,找到一个比中枢元素小的元素,和中枢元素交互位置 (此时,中枢元素已经易位)
3.从左到右扫描,找到一个比中枢元素大的元素,和中枢元素交互位置
重复步骤1-3,简单交换的代码如下:
void Swap(int &a,int &b){int temp;temp=a;a=b;b=temp;}//简单交互 int PartitionSwap(int a[],int low,int heigh){int piv=a[low];//选择序列的第一个为中枢元素 while(low<heigh){while(low<heigh && piv<=a[heigh]) --heigh;Swap(a[heigh],a[low]);while(low<heigh && piv>=a[low])++low;Swap(a[heigh],a[low]);} a[low]=piv; //原始中枢归位 return low; //返回中枢下标 }
上面代码的缺点:每一次找到了合适的元素都要和中枢元素进行交换位置。
改进:中枢元素只记录其值,暂时不考虑它的位置。当前扫描得到合适元素,直接覆盖上一次扫描得到的位置(第一次为中枢元素的原始位置)。最后一次扫描,得到的位置即为中枢元素的最终位置 ( ps:该方法在堆排序中也运用到了)
//改进填充 int PartitionFill(int a[],int low,int heigh){int piv=a[low];//选择序列的第一个为中枢元素 while(low<heigh){while(low<heigh && piv<=a[heigh]) --heigh;a[low]=a[heigh]; while(low<heigh && piv>=a[low])++low;a[heigh]=a[low];} a[low]=piv; //原始中枢归位 return low; //返回中枢下标 }
快速排序递归过程:
int QuickSort(int a[],int low,int heigh){if(low<heigh){int pivpos=PartitionFill(a,low,heigh);//获得当序列的中枢位置 QuickSort(a,low,pivpos-1); //递归排序左边序列 QuickSort(a,pivpos+1,heigh); //递归排序右边序列 }}
后言:该算法的思想可以解决如,红白蓝旗分类和正数在负数后一类的问题
0 0
- 夕拾-数据结构-快速排序
- 数据结构之快速排序
- 数据结构练习:快速排序
- 数据结构之快速排序
- 数据结构之------快速排序
- 快速排序<参考数据结构>
- 数据结构之快速排序
- 数据结构 快速排序
- 数据结构之快速排序
- 【数据结构】快速排序
- 数据结构_快速排序
- 数据结构 - 快速排序
- C++数据结构--快速排序
- C++数据结构--快速排序
- 数据结构--冒泡、快速排序
- 数据结构之快速排序
- 数据结构之快速排序
- [数据结构]快速排序
- Android Intent全面解析
- Effective Objective-C 2.0 学习笔记
- 友元实例:友元类及友元函数
- 观影会
- LCD——画线函数Glib_Line算法
- 夕拾-数据结构-快速排序
- Spark学习之路
- 状态模式
- 基本算法
- B\S备忘录番外篇——啊!这是一篇总结!
- 偏微分方程图像处理——基于热方程的图像去噪
- 验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保 <machineKey> 配置指定了相同的...
- Lecture5-2Effective number of lines
- bzoj-2741 L