快速排序

快速排序是基于分治策略来完成的,通过排序把一个无序数列分割为两部分,而其中一部分的数据都比另一部分的数据要小,然后再通过递归对数列的左右两部分做相同操作,从而最后达到一个有序的数列。

int partion (int a[], int beg, int end)
{
	int key = a[beg];			//选取数列的第一个数作为基准值
	int p = beg;
	int q = end;
	while (p < q)
	{
		while(p < q && a[q] >= key)
			q--;
		if (a[q] < key)
		{
			a[p] = a[q];
			p++;
		}
		while (p < q && a[p] <= key)
			p++;
		if (a[p] > key)
		{
			a[q] = a[p];
			q--;
		}
	}
	a[p] = key;
	return p;				//返回这个数的下标
}

假如我们要对下面这个10个数用快速排序进行升序排序,

0123456789
5163974820

按照快速排序的思想,我们首先用数组的第一个数作为基准,即key = 5,既然我们已经保存了这个数,则可以把数列看成下:

0123456789
 163974820

于是我们从数组的右面开始,寻找第一个比key值小的数,不难看出0就是这个数,于是将0放进数列左面的第一个空中,这时候下标9这个位置就变空了:

0123456789
016397482 

然后我们再从左面开始寻找第一个比key值大的元素,把它填到下标9的那个空中

0123456789
01 3974826

接着重复第二个步骤,从右面开始扫描

0123456789
01239748 6

接着左边:
0123456789
0123 74896


0123456789
012347 896

0123456789
01234 7896

这时候,扫描两边的下标出现重合,说明已经完成,然后我们便可以把开始的key值填到最后一个坑中:


0123456789
0123457896

于是数列被5分成了两部分,接下来只需对这两部分递归进行排序则可以得到最终的结果

void quicksort (int a[], int beg, int end)
{
	if (beg < end)
	{
		int temp = partion(a, beg, end);
		quicksort(a, beg, temp-1);			//递归对被分割的左右数列进行排序
		quicksort(a, temp+1, end);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值