排序算法之(4)——快速排序
2015-06-09 10:53
337 查看
快速排序的思想是选取数组中的一个数为分界线,把大于它的数尽量往后放,小于它的数往前放。这样每一趟快速排序都确定一个数的最终位置,并且把数组list[p,…………,r]分成以list[q]为分界线的两个子数组。一般情况下,我们可以选择数组的最后一个元素作为分界线。
下面用例子说明:假设list[]=1 3 5 7 2 0 9 8 6 4,选取list[r]=list[9]=4为分界线
第一趟快速排序后:【1 3 2 0 】4【7 9 8 6 5】
然后对子数组【1 3 2 0】跟【7 9 8 6 5】使用相同的方法进行快速排序。
下面用例子说明:假设list[]=1 3 5 7 2 0 9 8 6 4,选取list[r]=list[9]=4为分界线
第一趟快速排序后:【1 3 2 0 】4【7 9 8 6 5】
然后对子数组【1 3 2 0】跟【7 9 8 6 5】使用相同的方法进行快速排序。
【快速排序实现一】
#include<iostream> using namespace std; //定义模板函数 template <class T> void quick(int list[],int p,int q); template <class T> int partion(T list[],int p,int r); template <class T> void quick(T list[],int p,int r) { if(p<r) { int q=partion(list,p,r); quick(list,p,q-1); quick(list,q+1,r); } } template <class T> int partion(T list[],int p,int r) { //随机选取一个数与最后一个数交换 int t=rand()%(r-p+1)+p; std::swap(list[t],list[r]); T temp=list[r]; //以最后一个数为支点 int i=p-1; //这里i记录当前小于等于分界线的最后一个数的位置 for(int j=p;j<=r-1;j++) { if(list[j]<=temp) { i++; std::swap(list[i],list[j]);//将第一个大于分界线的数跟不大于分界线的数进行交换 } } std::swap(list[i+1],list[r]); //i+1位置上的数为第一个大于分界线的数 return i+1; } int main() { int list[]={1,3,5,7,2,0,9,8,6,4}; quick(list,0,9); for(int i=0;i<10;i++) { cout<<list[i]<<" "; } cout<<endl; system("pause"); }
相关文章推荐
- 多线程批量执行等待全部结果
- CSS---清除浮动
- 皕杰报表单元格数据换行问题
- 关于选中ztree节点
- line-height之深入理解
- Spring 依赖注入的三种形式
- group by 查询分组后 组的条数
- Javascript 的addEventListener()及attachEvent()区别分析
- C#基础--之数据类型
- 高质量,高效率的多国语言软件开发(Web/PC/Mobile),使用接口约束/调用不同语言资源
- mysql serverid的理解和可能导致的复制问题
- docker高级应用之cpu与内存资源限制
- iOS 图片边框及阴影效果
- 解决CLOSE_WAIT 问题
- 第一篇csdn博客
- 常用javascript方法整理
- c++ assert() 使用方法
- UFLDL教程笔记及练习答案二(预处理:主成分分析和白化)
- vmware vmware esxi5.x安装方法及解决错误
- jaron插件的用法