//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. Tokyo Tyrant(TTServer)系列(三)-Memcache协议

    通过Memcache协议使用ttserver  通过telnet 127.0.0.1 9032 telnet连接到到启动的实例. 下面我们通过add添加key为key1和value为value1的数据 ...

  2. 移植MonkeyRunner的图片对照和获取子图功能的实现-Appium篇

    假设你的目标測试app有非常多imageview组成的话,这个时候monkeyrunner的截图比較功能就体现出来了. 而其它几个流行的框架如Robotium,UIAutomator以及Appium都 ...

  3. 准确率99%!基于深度学习的二进制恶意样本检测——瀚思APT 沙箱恶意文件检测使用的是CNN,LSTM TODO

    所以我们的流程如图所示.将正负样本按 1:1 的比例转换为图像.将 ImageNet 中训练好的图像分类模型作为迁移学习的输入.在 GPU 集群中进行训练.我们同时训练了标准模型和压缩模型,对应不同的 ...

  4. [Tomcat]Tomcat6和Tomcat7的区别

    Tomcat 7最大的改进是对Servlet 3.0和Java EE 6的支持.◆Tomcat 7完全支持Servlet 3.0规范◆Tomcat 7新增了对Java注释的支持◆Tomcat 7通过w ...

  5. Linux,Docker,Jenkins No such file or directory

    你们先休息下,我先哭哭! 今天在做交接项目的bug修改的时候,在创建文件的时候报错 No such file or directory 然后跟着路径去linux中查看了该路径,但确实存在,并且权限都是 ...

  6. Caffe_Example之训练mnist

    0.参考文献 [1]caffe官网<Training LeNet on MNIST with Caffe>; [2]薛开宇<读书笔记4学习搭建自己的网络MNIST在caffe上进行训 ...

  7. SQLSERVER 链接服务器执行存储过程

    1.创建链接服务器 exec sp_addlinkedserver 'server_tmp','','SQLOLEDB','192.168.1.1' -- server_tmp 为别名 exec sp ...

  8. 使用 Object.create实现js 继承

    二.Object.create实现继承 本文将来学习第七种继承方式Object.create()方法来实现继承,关于此方法的详细描述,请戳这里.下面来通过几个实例来学习该方法的使用: var Pare ...

  9. activity_note

    在activiti任务中,主要分为两大类查询任务(个人任务和组任务): 1.确切指定了办理者的任务,这个任务将成为指定者的私有任务,即个人任务. 2.无法指定具体的某一个人来办理的任务,可以把任务分配 ...

  10. php语法学习:轻松看懂PHP语言

    基础语法 开头结尾 PHP脚本以 "<?php " 开头以 "?>" 结尾 <!DOCTYPE html> <html>&l ...