一、快速排序
(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) );
}