快速排序与快速选择算法

一、快速排序

(1) 基本思想

(2) C实现

// 快速排序, 平均时间复杂度O(NlogN)
void quickSort( DataType* A, int beg, int end )
{
	int i, j;
	DataType pivot = A[beg];

	if ( beg >= end ) return;   // 递归边界
	
	i = beg;
	j = end+1;

	// 将数组分为小于pivot和大于pivot的两部分
	for( ;; )
	{
		while( A[++i] < pivot );
		while( A[--j] > pivot );
		if ( i > j ) break;
		SWAP( A[i], A[j] );
	}
	SWAP( A[beg], A[j] );

	// 对两个子数组递归
	quickSort( A, beg, j-1 );
	quickSort( A, j+1, end );
}

其中对DataType和SWAP的定义:

typedef int DataType;
#define SWAP(x,y)  {DataType t=x;x=y;y=t;}

二、快速选择算法

(1) 问题描述

(2) 基本思想

(3) C实现

// 快速选择,平均时间复杂度O(N)
int quickSelect( DataType* A, int beg, int end, int K )
{
	DataType pivot; 
	int i, j;

	if ( end - beg + 1 < K )  // error
	{
		printf("error!\n");
		exit(0);
	}

	pivot = A[beg];
	i = beg;
	j = end + 1;

	// 将数组分为小于pivot和大于pivot的两部分
	for ( ;; )
	{
		while( A[++i] < pivot );
		while( A[--j] > pivot );
		if ( i > j ) break;
		SWAP( A[i], A[j] );
	}
	SWAP( A[beg], A[j] );

	if ( j - beg  == K-1 )   // 如果小于pivot的数目刚好为K-1个,这返回该pivot
		return A[j];
	else if ( j - beg >= K ) // 否则,如果小于pivot的数目大于K-1个,则返回该部分中第K大的数
		return quickSelect( A, beg, j-1, K );
	else
		return quickSelect( A, j+1, end, K-(j-beg+1) );
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值