快速排序算法的几种实现
来源:互联网 发布:网络电视怎么看电影 编辑:程序博客网 时间:2024/05/17 07:52
1.一种简单的快速排序:
序列范围[l,u]
选取第一个元素为枢纽值,然后围绕t划分数组:
m=a-1for i =[a,b] if x[i]<t swap(x[++m],x[i])
其中a=l+1,b=u。
循环终止后有:
此时交换x[l]和x[m]即可。
代码:
void qsort1(int *x, int l, int u){if (l >= u)return;int m = l;for (int i = l+1; i <= u; ++i){if (x[i] < x[l])swap(x[++m], x[i]);}swap(x[l], x[m]);qsort(x, l, m - 1);qsort(x, m + 1, u);}
可以通过qsort1(0,n-1)来排序数组x[n]
qsort1函数能够快速完成随机序列的排序,但是对于序列由n个相同的元素组成时,性能就非常差,从代码中我们可以看出,当序列元素相同时,qsort1的时间复杂度为O(n²)。
使用双向划分可以解决这个问题。
2.稍微改进的快速排序
对于上面的快速排序,我们可以稍微改进:
代码:
void qsort2(int *x, int l, int u){if (l >= u)return;int m = u+1;for (int i = u; i >=l; --i){if (x[i] >= x[l])swap(x[--m], x[i]);}qsort2(x, l, m - 1);qsort2(x, m + 1, u);}
通过将从左到右的循环修改为从右向左,从而省去一次swap:
最后一次循环结束前:
3.更好的几种快速排序算法
使用双向划分的快速排序:
i指示小于等于t的增长边界,j指向大于等于t的增长边界。
代码:
void qsort3(int *x, int l, int u){if (l >= u)return;int t = x[l];int i = l, j = u + 1;while (1){while (++i <= u && x[i] < t);while (x[j] > t);if (i > j)break;swap(x[i], x[j]);}swap(x[l], x[j]);qsort3(x, l, j - 1);qsort3(x, j + 1, u);}
当while(1)循环结束时,序列变成:
所以最后进行swap(x[l],x[j])。
这里特别要注意i和j,swap的是x[j]不是x[i]!!!
我们注意到:
while (++i <= u && x[i] < t);
while (x[j] > t);
为什么第二个while不写成while (--j >= l && x[j] > t)?因为没有必要,序列的第一个元素为t,当j==l时有x[j]==t,该循环总是能终止不会发生越界情况(相当于第一个元素为哨兵),而第一个while则不同。
当遇到和t相同的元素时,停止扫描并交换x[i]和x[j],这样做虽然交换的次数增加了,但却将所有元素相同的最坏情况变成了差不多需要nlogn次比较的最好情况。
但是,如果序列已经排好序了,上面的代码性能依然会下降到O(n²),原因是我们每次都是选择第一个元素作为划分元素。我们可以通过随机选择划分元素来解决:
int c=randint(l,u);swap(x[l],x[c]);其中函数randint(l,u)产生[l,u]之间的随机数。
阅读全文
0 0
- 快速排序算法的几种实现
- 快速排序算法的几种版本及实现
- 快速排序算法的思想和几种实现方式
- 几种快速的排序算法
- 快速排序的几种C++实现
- 快速排序的几种实现方法
- 快速排序的几种实现
- 快速排序的几种实现方式
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 001-简单的java代码实现几种排序算法(插入,快速,冒泡,选择)
- 几种常见排序算法的实现(冒泡法,选择法,插入法,快速排序、堆排序)
- 几种排序算法的实现
- 几种排序算法的实现
- 几种排序算法的实现代码
- Java实现的几种排序算法
- 几种排序算法的实现
- 几种排序算法的C++ 实现
- 几种常见的排序算法实现
- 去掉开机提示“android is starting”的提示框
- 海航集团负债率始终处于一个健康状态
- 百度2016实习-编号转换
- es6基础回顾--Generator函数
- css中设置隐藏,如何对隐的部分添加点击事件
- 快速排序算法的几种实现
- c# c均值聚类及DBSCAN聚类
- instanceof 与isAssignableFrom区别
- MySQL---数据库从入门走向大神系列(三)-修改数据库编码/DOS窗口编码
- Python: PS 图像调整--黑白
- 51nod 1821 最优集合 (思维+并查集or栈)
- UIButton,设置为UIButtonTypeCustom类型时,做圆角效果
- Release版本只在iOS9.2及以下闪退
- PAT 1005. 继续(3n+1)猜想