排序之快速排序(Quick Sort)

快速排序(Quick Sort)基本思想:

1.先从数列中取出一个数作为基准数。

2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。

3.再对左右区间重复第二步,直到各区间只有一个数。


举例:

以最后一个元素为主元(关键字Key)

    



返回下标:i + 1 = 4;

将序列分为[23 4 12 7] 和[67 90 56],再分别对两个子序列递归进行快速排序;


代码实现:

#include<iostream>
#include<exception>
using  namespace std;
//---------------------------------------------快速排序Soulation1---------------------------------------
int partion_Soulation1(int* data , int start , int end);//取最后元素为主元  //优化版本,思路清晰
int partion_Soulation2(int* data , int start , int end);//取最后元素为主元
int partion_Soulation3(int* data , int satrt , int end);//取第一个元素为主元
int partion_Soulation4(int* data , int start , int end);//三位取中元(最终优化)

void  QuickSort_Soulation1(int* data , int start , int end)
{
	if(data == NULL || (start >= end) )
		throw new std::exception("InvalidInput parameters");
		return;

	if(start < end)
	{
		int part = partion_Soulation1(data , start , end);
		QuickSort_Soulation1(data , start , part - 1);
		QuickSort_Soulation1(data , part + 1 , end);

	}
}
int partion_Soulation1(int* data , int start , int end)
{
	int key = data[end];
	int i = start - 1;

	for(int j = start; j < end; j++)
	{
		if(data[j] <= key)
		{
			i++;
			swap(data[i] , data[j]);
		}
	}

	//swap(data[i + 1] , key); 错误
	swap(data[i + 1] , data[end]);
	return i + 1;
}

//--------------------------------------------------Soulation2----------------------------------------------------------
void  QuickSort_Soulation2(int* data , int start , int end)
{
	if(data == NULL || (start >= end) )
		throw new std::exception("InvalidInput parameters");
		return;

	if(start < end)
	{
		int part = partion_Soulation2(data , start , end);
		QuickSort_Soulation2(data , start , part - 1);
		QuickSort_Soulation2(data , part + 1 , end);

	}
}

int partion_Soulation2(int* data , int start , int end)
{
	int key = data[end];
	int i = start - 1;

	//start <= j <= end
	for(int j = start; j <= end; j++)
	{
		if(data[j] <= key)
		{
			i++;
			swap(data[i] , data[j]);
		}
	}

	//去掉swap(data[i + 1] , data[end])
	return i;
}

//---------------------------------------------------Soulation3---------------------------------------------------------

void QuickSort_Soulation3(int* data , int start , int end)
{
	if(data == NULL || (start >= end) )
		throw new std::exception("InvalidInput parameters");
		return;

	if(start < end)
	{
		int part =  partion_Soulation3(data , start , end);
		QuickSort_Soulation3(data , start , part-1);
		QuickSort_Soulation3(data , part + 1 , end);
	}
}

int partion_Soulation3(int* data , int start , int end)
{
	int key = data[start];
	int i = start;
	int j = end;
	while(i < j)
	{
		while(key <= data[j] && i < j)
			j--;
		data[i] = data[j];
		while(data[i] <= key && i < j)
			i++;
		data[j] = data[i];
	}

	data[i] = key;
	return i;
}

//----------------------------------------------------Soulation4--------------------------------------------------
void QuickSort_Soulation4(int* data , int start , int end)
{
	if(data == NULL || (start >= end) )
		throw new std::exception("InvalidInput parameters");
		return;

	if(start < end)
	{
		int part =  partion_Soulation3(data , start , end);
		QuickSort_Soulation4(data , start , part-1);
		QuickSort_Soulation4(data , part + 1 , end);
	}
}

int partion_Soulation4(int* data , int start , int end)
{
	int key;
	
	int mid = (end + start) / 2;
	if(data[start] > data[end])
		swap(data[start] , data[end]);
	if(data[mid]>data[end])
		swap(data[mid] , data[end]);
	if(data[mid] > data[start])
		swap(data[mid] , data[start]); //将start , mid 中较大者赋值给start 

	 key = data[start];                       //中间数赋值给key
	int i = start;
	int j = end;
	while(i < j)
	{
		while(key <= data[j] && i < j)
			j--;
		data[i] = data[j];
		while(data[i] <= key && i < j)
			i++;
		data[j] = data[i];
	}

	data[i] = key;
<pre code_snippet_id="102955" snippet_file_name="blog_20131208_1_7339271" name="code" class="cpp">       /*功能一样
       while(i < j)
	{
		while(key <= data[j] && i < j)
			j--;
		swap(data[i] , data[j])
		while(data[i] <= key && i < j)
			i++;
		swap(data[i],data[j])
	}
*/return i;}
 

大牛博客: http://blog.csdn.net/v_july_v/article/details/6116297

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值