高速排序算法C++实现
//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++实现的更多相关文章
- java:高速排序算法与冒泡排序算法
Java:高速排序算法与冒泡算法 首先看下,冒泡排序算法与高速排序算法的效率: 例如以下的是main方法: /** * * @Description: * @author:cuiyaon ...
- 编程算法 - 高速排序算法 代码(C)
高速排序算法 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 经典的高速排序算法, 作为一个编程者, 不论什么时候都要完整的手写. 代码: /* * m ...
- 具体解释Redis源代码中的部分高速排序算法(pqsort.c)
看标题.你可能会疑惑:咦?你这家伙.怎么不解说完整的快排,仅仅讲一部分快排---.- 哎,冤枉. "部分快排"是算法的名字.实际上本文相当具体呢.本文差点儿与普通快排无异.看懂了本 ...
- python实现高速排序算法(两种不同实现方式)
# -*- coding: utf-8 -*- """ Created on Fri May 16 17:24:05 2014 @author: lifeix " ...
- 【从零学习经典算法系列】分治策略实例——高速排序(QuickSort)
在前面的博文(http://blog.csdn.net/jasonding1354/article/details/37736555)中介绍了作为分治策略的经典实例,即归并排序.并给出了递归形式和循环 ...
- 《算法导论》 — Chapter 7 高速排序
序 高速排序(QuickSort)也是一种排序算法,对包括n个数组的输入数组.最坏情况执行时间为O(n^2). 尽管这个最坏情况执行时间比較差.可是高速排序一般是用于排序的最佳有用选择.这是由于其平均 ...
- 高速排序及优化(Java版)
高速排序(Quicksort)是对冒泡排序的一种改进. 高速排序由C. A. R. Hoare在1962年提出. 一次高速排序具体过程: 选择数组第一个值作为枢轴值. 代码实现: package Qu ...
- http://www.html5tricks.com/demo/jiaoben2255/index.html 排序算法jquery演示源代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.or ...
- 七内部排序算法汇总(插入排序、Shell排序、冒泡排序、请选择类别、、高速分拣合并排序、堆排序)
写在前面: 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的随意序列,又一次排列成一个按keyword有序的序列.因此排序掌握各种排序算法很重要. 对以下介绍的各个排序,我们假定全部排 ...
随机推荐
- Mina airQQ聊天 client篇(三)
开发工具 (FlashBuilder4.7) 程序类型(Adobe Air) Flex Air做的桌面程序,效果还挺好看的.最主要是Socket这一块,它也是异步的,而且在Flex中的事件机制比較强大 ...
- UVA 11426 - GCD - Extreme (II) 欧拉函数-数学
Given the value of N, you will have to find the value of G. The definition of G is given below:G =i< ...
- 百度编辑器图片在线流量返回url改动
百度编辑器中返回的是我们server中的url,有时并非我们须要的,比方图文编辑中.我想在线浏览上传过的图片 ,那么我返回的应该是腾讯server上面的url.这样才不会被腾讯的过滤器过来掉,全部我们 ...
- 光标属性CSS cursor 属性
CSS cursor 属性 CSS cursor属性,以前不知道,如果以后用到自己看的 <html> <body> <p>请把鼠标移动到单词上,可以看到鼠标指针发生 ...
- 编译安装FFmpeg 要支持xvid、x264、mp3、ogg、amr、faac
编译安装FFmpeg 要支持xvid.x264.mp3.ogg.amr.faac libfaac faac格式的编解码包libmp3lame mp3格式编解码包libopencore-am ...
- JQuery 登录窗口的布局
<!-- Button trigger modal --><button type="button" class="btn btn-primary bt ...
- centos7 usually use
firewall-cmd --permanent --add-rich-rule 'rule family=ipv4 source address=192.168.22.103 port port=8 ...
- Python 递归和二分查找
# 二分查找l1 = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88] def two_search( ...
- 用VS2015创建ASP.NET Web Forms 应用程序
在 Visual Studio 2015 中,按着以下步骤创建一个 Web Forms 应用程序项目: 1.起始页/文件--->新建项目--->已安装--->模板--->Vis ...
- 任何抛开业务谈大数据量的sql优化都是瞎扯
周三去某在线旅游公司面试.被问到了一个关于数据量大的优化问题.问题是:一个主外键关联表,主表有一百万数据,外键关联表有一千万的数据,要求做一个连接. 本人接触过单表数据量最大的就是将近两亿行历史数据( ...