Introduce to algorithm--------pseudo code to C/C++ code(Chapter 7)

快速排序(简称快排):

为什么叫它快速排序呢,在我自己的理解里,因为快速排序的每一步排序过程都使得:有某个位置i, 

经一步排序后,数组i位置上的值为完整排序后的数值, 即排序过程的每一步都较之整个排序过程快一步

获得一个已正确排序的数值,所以叫它 ‘快速’ 排序。 假设快速排序由n步的process过程组成,对于数

组A[size],快排每次调用process后,有某个值i, 使得A[i]的数值为正确排序后的数值, 并且任何位于i位

置之前的元素都小于等于A[i], 任何位于i之后的元素都大于等于A[i]。

具体来说: 现在对数组A[5] = { 0, 2, 3,1,4 }, 调用快排算法,而快排算法则多次调用process子

过程, 则每个调用过程后数组的结果可能为:

A[5] = { 0, 1, 3, 2, 4 }

A[5] = { 0, 1, 2, 3, 4 }

A[5] = { 0, 1, 2, 3, 4 }

A[5] = { 0,1, 2, 3, }

红色标出的元素为算法每一步所正确 ‘置位’ 的元素。实际上快排也蕴含了分治思想(divide、conquer、merge)。

采用了二分法设计函数。

以下是快排代码(C/C++):

template <typename T>
//p,r are the corresponding index of array head and tail
void quick_sort (T* A, int p, int r)
{
	if (p < r)
	{
		int q = partition<T> (A, p, r);
		quick_sort<T> (A, p, q - 1);
		quick_sort<T> (A, q + 1, r);
	}
}

template <typename T>
//p,r representing the same meaning as above
int partition (T* A, int p, int r)
{
	T 	x = A[r];
	int i = p - 1;
	
	for (int j = p; j <= r - 1; ++j)
		if (A[j] <= x)
		{
			++i;
			
			T 	temp = A[i];
			A[i] = A[j];
			A[j] = temp;
		}
	
	T 	temp = A[i + 1];
	A[i + 1] = A[r];
	A[r] = temp;
	return i + 1;	
}

quick_sort就不多说了,partition函数即之前陈述的process子过程:将某个位置i上的元素正确 ‘置位’ ,并使i左边的

元素小于等于它,使右边的元素大于等于它。

For detail information, see Introduce to algorithm.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值