程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 快速排序算法C++實現

快速排序算法C++實現

編輯:關於C++
//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


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved