快速排序

基本思想

        以某个记录的关键字为比较的基准(划分元),将整个序列划分为两组,左边记录的关键字小于等于划分元,右边的关键字大于等于划分元,而划分元所属记录的位置就是最终有序序列中的位置。对左右部分数据,再各自选取一个记录的关键字作为划分元,将两个子序列划分成更小的子序列,这样一直进行下去,最终将整个序列排列成有序序列。对划分元的选择,最简单的办法就是选取当前序列的第一个关键字为划分元。

具体过程

        设置2个指针 i 和 j指向序列的2端,

        1. 将指针i处的记录保存到临时存储单元。

        2. 从右端j处开始向左查找,直到某个记录的值比划分元小,交换i、j指向的值。i++

        3. 从左端i处开始向右查找,直到某个记录的值比划分元大,交换i、j指向的值。j--

        4. 循环2和3,直到 i>=j。

        5. 对左、右子序列应用1-4步骤

        1-4即是一次交换过程,划分之后可以对左右子序列重复1-4过程直到完成排序。

代码实现:

        

void showdata(int* a, int n)
{
	for (int i = 0; i < n; i++)
	{
		cout << a[i] << " ";
	}
	cout << endl;
}


void  quicksort(int *a,int i, int j)
{	
	cout << i << "  " << j << endl;
	if (i >= j)
	{
		return;
	}

	int left = i;
	int right = j;

	int tmp = a[i];

	while (i < j)
	{
		while (a[j] > tmp && i<j)
		{
			j--;
		}
		if (i < j)
		{
			a[i] = a[j];
			i++;
		}


		while (a[i] < tmp && i<j)
		{
			i++;
		}
		if (i < j)
		{
			a[j] = a[i];
			j--;
		}
	}
	
	a[i] = tmp;
	cout << "lr: i="<<i  <<"   "<<left << "  " << right << endl;
	showdata(a, 11);

	quicksort(a, left, i - 1);
	quicksort(a, i + 1, right);


}



int main()
{	
	int a[] = { 56,23,67,26,85,14,17,68,73,45,77 };
	
	quicksort(a, 0, 10);


}

运行截图:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值