博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
高速排序算法C++实现
阅读量:6827 次
发布时间:2019-06-26

本文共 2316 字,大约阅读时间需要 7 分钟。

//quick sort//STL中也有现成的高速排序算法。内部实现採用了下面技巧//1)枢轴的选择採取三数取中的方式//2)后半段採取循环的方式实现//3)高速排序与插入排序结合#include
#include
#include
using namespace std;//这一版本号是最简单实现版本号。对于高速排序的优化主要有下面几个方面://1)枢轴的选择。若枢轴选取不全适。比方,若每次递归时,两个子区间中的一个为空,则高速排序将退化为冒泡排序//关于枢轴的选择有多种:取最后一个元素、取第一个元素、三数取中、九数取中、随机值等//2)还有一方面是对迭代过程的优化。降低交换次数,降低递归深度等;template
int partion1(vector
& vec,int start,int end){//高速排序的核心部分 //取最后一个作为枢轴和第一个作为枢轴程序相似,下面是取最后一个元素作为枢轴 int key=vec[end]; int fast,slow; fast=slow=start; //用两个指针的移动实现 for(;fast
int midNumber(type a,type b,type c){ int big1=max(a,b); int big2=max(a,c); int big3=max(b,c); return min(big1,min(big2,big3));}template
int partion2(vector
& vec,int start,int end){ //3数取中和9数取中的方式,保证了一定随机性,下面是3数取中的方式 int key=midNumber(vec[start],vec[(start+end)/2],vec[end]); int midNumPos=0; if(key==vec[start]) midNumPos=start; else if(key==vec[end]) midNumPos=end; else midNumPos=(start+end)/2; vec[midNumPos]=vec[end]; vec[end]=key; //如今採用一种和上一种方案不同的交换方式 while(start
=key) end--; tmp=vec[start]; vec[start]=vec[end]; vec[end]=tmp; } return start;}template
int partion3(vector
& vec,int start,int end){//取随机数的方法 int keyNumPos=start+rand()%(end-start); int tmp=vec[keyNumPos]; vec[keyNumPos]=vec[end]; vec[end]=tmp; int key=vec[end]; while(start
=key) end--; tmp=vec[start]; vec[start]=vec[end]; vec[end]=tmp; } return start;}//以上是三种对枢轴的优化方法。无非就是避免高速排序恶化//下面是避免不必要的交换过程template
int partion4(vector
& vec,int start,int end){//取随机数的方法 int keyNumPos=start+rand()%(end-start); int tmp=vec[keyNumPos]; vec[keyNumPos]=vec[end]; vec[end]=tmp; int key=vec[end]; while(start
=key) end--; vec[start]=vec[end];//start以end覆盖 } vec[start]=key; return start;}template
void qSort1(vector
& vec,int start,int end){ if(start>=end)return; int index=partion4(vec,start,end);//key qSort1(vec,start,index-1); qSort1(vec,index+1,end);}//递归过程须要出栈入栈,成本较高,并且可能栈溢出。假设可能的话最好以循环方式取代递归template
void qSort2(vector
& vec,int start,int end){ if(start>=end)return; int index;//key while(start
void qSort3(vector
& vec,int start,int end){ if(start>=end)return; int index;//key if(end-start>VALUE) { while(start
void quickSort(vector
& vec){ int length=vec.size(); qSort2(vec,0,length-1);}int main(){ int a[10]={1,5,9,0,6,3,2,7,8,4}; vector
vec(a,a+10); quickSort(vec); for(int i=0;i

转载地址:http://qeukl.baihongyu.com/

你可能感兴趣的文章
如何写一个无配置格式统一的日志
查看>>
tsconfig.json整理记录
查看>>
adb通信协议分析以及实现(四):adb shell 命令分析
查看>>
日常工作中,个人总结的 - Git - 常用操作方法 (一)
查看>>
面试中被面试官问到的问题答案(一)
查看>>
使用属性Props完成一张卡片
查看>>
49. Group Anagrams
查看>>
TypeScript实现数据结构(一)栈,队列,链表
查看>>
IOS评论框不贴底(ios12新bug)
查看>>
26. Remove Duplicates from Sorted Array
查看>>
Jenkins in Action :GitLab 部署 Maven 项目
查看>>
从0开始构建SpringCloud微服务(1)
查看>>
Linux Shell 生成随机数和随机字符串
查看>>
泛型之通配符
查看>>
PHP_SELF变量解析和重复路径解决
查看>>
解决mac下webstorm编辑器识别less的问题
查看>>
微服务所需组件(大部分是Spring Cloud,持续更新)
查看>>
JavaScript闯关笔记
查看>>
Nacos系列:基于Nacos的配置中心
查看>>
做Web前端开发的你必须会这几点!
查看>>