快排算法

本文详细解析了一段快速排序算法的实现代码,包括其基本原理、时间复杂度分析以及如何通过随机选择划分基准来提高算法性能。重点讨论了如何在算法的每一步中,从数组的起始到结束范围内随机选择一个元素作为划分基准,以期望获得更对称的划分结果,从而提升算法效率。

很早之前看学姐写过的一个快排算法,当时琢磨了很久来着,现在我们开的有 算法设计与分析 这门课,书上有讲快排的,琢磨了好一会儿嘞^_^

 

具体代码如下啦:

#include<stdio.h>
#include<stdlib.h>
// 快排算法平均时间复杂度为 O(nlogn), 最坏情况下为 O(n^2)
#define Type int

Type a[10]={0};

void Swap( Type &x, Type &y)
{
	Type t;
	t = x;
	x = y;
	y = t;
}
int Partion( Type a[], int p, int r )
{	// p,r 为起始和终止坐标
	int i = p, j = r + 1;
//	i = rand()%(r-p+1) + p;				// 随机选择划分基准点 注意:i 值大小介于 p 到 r 间
//	Swap(a[i], a[p]);
	Type x = a[i];
//	i = p;
	while(1)
	{
		while( a[++i] < x && i < r)		// i 的值小于 r, 当 i 的值为 r 时并不进行交换,所以就不用循环了
		{}
		while( a[--j] > x && j > p)
		{}
		if(i >= j)
			break;
		Swap( a[i], a[j]);
	}
	a[p] = a[j];						// 只能这样做,假如不事先把 a[p] 单独拿出来,不然直接交换结束后,
	a[j] = x;							// i 和 j 到底哪个指的是值为 x 的,是不确定的
	return j;
}
void QuickSort( Type a[], int p, int r)
{
	if( p < r)
	{
		int q = Partion( a, p, r);
		QuickSort( a, p, q-1);
		QuickSort( a, p+1, r);
	}
}

int main()
{
	int i;
	printf("Please enter 10 elements: ");
	for( i = 0; i < 10; i++)
		scanf("%d", &a[i]);
	QuickSort( a, 0, 9);
	for( i = 0; i < 10; i++)
		printf("%d ", a[i]);
	printf("\n");
	return 0;
}

快速排序算法的性能取决于划分的对称性,通过修改 Partition 可以设计出采用随机选择策略的快速排序算法。在快速排序算法的每一步当中,当数组还没有被划分时,可以在 a[p]  到 a[r]  间随机选出一个元素作为划分基准,这样可以使划分基准的选择是随机的,从而可以期望划分时较对称的。

 

把上面代码中,添上我注释掉的代码就是 RandomizedPartition 了~~

 

其中用到了 rand()  函数来产生一个随机数,为控制随机数介于 p 到 r 间,利用了模运算O(∩_∩)O

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值