关闭

快速排序与快速选择算法

标签: 算法pivotc
7482人阅读 评论(0) 收藏 举报
分类:

一、快速排序

(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) );
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:130439次
    • 积分:1507
    • 等级:
    • 排名:千里之外
    • 原创:28篇
    • 转载:2篇
    • 译文:0篇
    • 评论:29条
    最新评论