//quick sort
//STL中也有现成的高速排序算法。内部实现採用了下面技巧
//1)枢轴的选择採取三数取中的方式
//2)后半段採取循环的方式实现
//3)高速排序与插入排序结合
#include<vector>
#include<iostream>
#include<algorithm> using namespace std; //这一版本号是最简单实现版本号。对于高速排序的优化主要有下面几个方面:
//1)枢轴的选择。若枢轴选取不全适。比方,若每次递归时,两个子区间中的一个为空,则高速排序将退化为冒泡排序
//关于枢轴的选择有多种:取最后一个元素、取第一个元素、三数取中、九数取中、随机值等
//2)还有一方面是对迭代过程的优化。降低交换次数,降低递归深度等;
template<class type>
int partion1(vector<type>& vec,int start,int end)
{//高速排序的核心部分
//取最后一个作为枢轴和第一个作为枢轴程序相似,下面是取最后一个元素作为枢轴
int key=vec[end];
int fast,slow;
fast=slow=start; //用两个指针的移动实现
for(;fast<end;++fast)
{
if(vec[fast]<key)
{
if(fast!=slow)
{
int tmp=vec[slow];
vec[slow]=vec[fast];
vec[fast]=tmp;
}
slow++;
}
}
int tmp=vec[slow];
vec[slow]=vec[end];
vec[end]=tmp;
return slow;
} //三数取中
template<class type>
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<class type>
int partion2(vector<type>& 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<end)
{//枢轴的位置一直在改变
while(start<end && vec[start]<=key)
start++; int tmp=vec[start];
vec[start]=vec[end];
vec[end]=tmp; while(start<end && vec[end]>=key)
end--; tmp=vec[start];
vec[start]=vec[end];
vec[end]=tmp;
} return start;
} template<class type>
int partion3(vector<type>& 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<end)
{//枢轴的位置一直在改变
while(start<end && vec[start]<=key)
start++; tmp=vec[start];
vec[start]=vec[end];
vec[end]=tmp; while(start<end && vec[end]>=key)
end--; tmp=vec[start];
vec[start]=vec[end];
vec[end]=tmp;
}
return start;
}
//以上是三种对枢轴的优化方法。无非就是避免高速排序恶化
//下面是避免不必要的交换过程
template<class type>
int partion4(vector<type>& 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<end)
{//观察可知,交换的过程中,总有一个数是key,所以当须要赋key值时能够直接跳过,于是能够降低赋值操作
while(start<end && vec[start]<=key)
start++; vec[end]=vec[start];//end以start覆盖 while(start<end && vec[end]>=key)
end--; vec[start]=vec[end];//start以end覆盖
}
vec[start]=key;
return start;
} template<class type>
void qSort1(vector<type>& 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<class type>
void qSort2(vector<type>& vec,int start,int end)
{
if(start>=end)return; int index;//key
while(start<end)
{//后半段的递归过程以循环取代。相当于减小了递归深度
index=partion4(vec,start,end);//key
qSort2(vec,start,index-1);
start=index+1;
}
} //当处理的数据量比較小时,插入排序的成本可能比高速排序成本更低,所以考虑在数据量较小时採用插入排序 /*template<class type>
void qSort3(vector<type>& vec,int start,int end)
{
if(start>=end)return; int index;//key
if(end-start>VALUE)
{
while(start<end)
{//后半段的递归过程以循环取代,相当于减小了递归深度
index=partion4(vec,start,end);//key
qSort3(vec,start,index-1);
start=index+1;
}
}
else
{
insertSort(vec,start,end);
}
}*/ template<class type>
void quickSort(vector<type>& 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<int> vec(a,a+10); quickSort(vec); for(int i=0;i<vec.size();++i)
cout<<vec[i]<<" ";
cout<<endl;
return 0;
}

高速排序算法C++实现的更多相关文章

  1. java:高速排序算法与冒泡排序算法

     Java:高速排序算法与冒泡算法 首先看下,冒泡排序算法与高速排序算法的效率: 例如以下的是main方法: /**   *  * @Description:  * @author:cuiyaon ...

  2. 编程算法 - 高速排序算法 代码(C)

    高速排序算法 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 经典的高速排序算法, 作为一个编程者, 不论什么时候都要完整的手写. 代码: /* * m ...

  3. 具体解释Redis源代码中的部分高速排序算法(pqsort.c)

    看标题.你可能会疑惑:咦?你这家伙.怎么不解说完整的快排,仅仅讲一部分快排---.- 哎,冤枉. "部分快排"是算法的名字.实际上本文相当具体呢.本文差点儿与普通快排无异.看懂了本 ...

  4. python实现高速排序算法(两种不同实现方式)

    # -*- coding: utf-8 -*- """ Created on Fri May 16 17:24:05 2014 @author: lifeix " ...

  5. 【从零学习经典算法系列】分治策略实例——高速排序(QuickSort)

    在前面的博文(http://blog.csdn.net/jasonding1354/article/details/37736555)中介绍了作为分治策略的经典实例,即归并排序.并给出了递归形式和循环 ...

  6. 《算法导论》 — Chapter 7 高速排序

    序 高速排序(QuickSort)也是一种排序算法,对包括n个数组的输入数组.最坏情况执行时间为O(n^2). 尽管这个最坏情况执行时间比較差.可是高速排序一般是用于排序的最佳有用选择.这是由于其平均 ...

  7. 高速排序及优化(Java版)

    高速排序(Quicksort)是对冒泡排序的一种改进. 高速排序由C. A. R. Hoare在1962年提出. 一次高速排序具体过程: 选择数组第一个值作为枢轴值. 代码实现: package Qu ...

  8. http://www.html5tricks.com/demo/jiaoben2255/index.html 排序算法jquery演示源代码

      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.or ...

  9. 七内部排序算法汇总(插入排序、Shell排序、冒泡排序、请选择类别、、高速分拣合并排序、堆排序)

    写在前面: 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的随意序列,又一次排列成一个按keyword有序的序列.因此排序掌握各种排序算法很重要. 对以下介绍的各个排序,我们假定全部排 ...

随机推荐

  1. mybatis使用generator自己主动生成代码时的类型转换

    使用mybatis的generator自己主动生成代码,可是oracle数据库中number(6,2)总是自己主动转成BigDecimal.我想要转成的是float类型 这样就写了一个类型转换器,须要 ...

  2. Ubuntu桌面基础介绍

    1. 目录结构和文件系统 ubuntu的文件系统也是一个又层次的树形结构,文件系统的最上层是 / ,表示根目录,所有其他文件和目录都位于跟目录下,在linux中,一切皆为文件,包括硬盘.分区和拔插介质 ...

  3. DB-MySQL:MySQL 临时表

    ylbtech-DB-MySQL:MySQL 临时表 1.返回顶部 1. MySQL 临时表 MySQL 临时表在我们需要保存一些临时数据时是非常有用的.临时表只在当前连接可见,当关闭连接时,Mysq ...

  4. 关于TCP的三次握手和四次分手 专题

    客户端TCP状态迁移:CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSE ...

  5. LA 3635 Pie

    题意:给出n个圆,分给n+1个人,求每个人最多能够得到多大面积的圆 二分每个人得到的圆的面积 #include<iostream> #include<cstdio> #incl ...

  6. CorelDRAW升级计划--如何购买

    了解通过全新 CorelDRAW 2017升级计划更新此图形设计软件所有最新功能的实惠方案.助升级计划,您可以在下一主要产品版本推出时便收到该版本,从而始终使您的产品保持最新.升级计划取代为 X6 和 ...

  7. ZBrush 笔刷的基础参数

    ZBrush®中的笔刷基本参数主要包括3个:Draw Size(绘制大小).Focal Shift(焦点衰减)和Z Intensity(深度强度),通常使用这3个基本参数对笔刷进行调整. 在视图文档区 ...

  8. TF基础2

    1.常用API 1.图,操作和张量 tf.Graph,tf.Operation,tf.Tensor 2.可视化 TensorBoard 3.变量作用域 在TF中有两个作用域(scope),一个是nam ...

  9. LeetCode Golang 3. 无重复字符的最长子串

    3. 无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串 ...

  10. day06-1 与用户交互以及格式化输出

    目录 Python的与用户交互 Python2的input和raw_input(了解) 格式化输出 占位符 format函数格式化字符串 f-string格式化(方便) Python的与用户交互 in ...