快速排序

快速排序的算法介绍和算法演示见百度百科http://baike.baidu.com/view/19016.htm

#include <iostream>
#include <vector>
#include <iterator>
using namespace std;
//快排的思路:是通过不断的对数组进行二分,直到数组不能再分解为止(只有一个数据),步骤如下:
//(1)选择一个基准元素,通常选择第一个
//(2)通过一轮排序将数组分割成左右两部分,左边部分的元素比基准元素小,右边部分的元素比基准元素大;
//用first和last分别指向数组第一个元素和最后一个元素,直到first和last相等时,这一趟排序才算结束;
//(3)一轮排序结束后,基准元素刚好处于两部分元素的中间;
//(4)然后再对左右两部分用同样的方法进行排序,直到整个快排结束
//算法第一轮排序演示过程以及算法优缺点及改善分析见http://blog.youkuaiyun.com/ggran2009/article/details/47396123

//这个函数是一轮快速排序过程,对数组进行一次二分,当first和last碰头时(即相等),此趟排序结束;
//在这一轮排序的每次循环里:
//每次last从右往左寻找比第一个key小的元素时,将找到的元素a[last]与a[first]交换,即a[last]与key交换,交换之后a[last]的值等于key;
//每次first从左往右寻找比第一个key大的元素时,将找到的元素a[first]与a[last]交换,即a[first]与key交换,交换之后a[first]的值又等于key;
//周而复始,直到key找不到可交换的元素为止,至此一轮快速排序结束。
int partition(vector<int>&a, int low, int high)//找枢纽
{
	int first = low;
	int	last = high;
	int key = a[first];//用字表的第一个记录作为枢轴

	while (first < last)
	{
		while (a[last] >= key && first < last)
			--last;
		swap(a[first], a[last]);

		while (a[first] <= key && first < last)
			++first;
		swap(a[first], a[last]);
	}
	return first;//返回一个枢纽
}

void quickSort(vector<int>& a, int low, int high)
{
	if (low >= high)
		return;
	
	int p = partition(a, low, high);
	quickSort(a, low, p - 1);
	quickSort(a, p + 1, high);
}

int main()
{
	vector<int> v{6,2,7,3,8,9,11,5,78,34,13};
	quickSort(v, 0, v.size() - 1);

	copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值