问题:输入n个数,求其中最小的k个数。
对于该问题,有以下几种思路:
(1)堆排序。
代码如下:
void heapAdjust(int A[],int i,int size)
{
int l=2*i+1;
int r=2*i+2;
int big=i;
if(l<size&&A[l]>A[big])
{
big=l;
if(r<size&&A[r]>A[big])
big=r;
if(i!=big)
{
swap(A[i],A[big]);
heapAdjust(A,big,size);
}
}
}
void makeHeap(int A[],int size)
{
for(int i=size/2;i>=0;--i)
{
heapAdjust(A,i,size);
}
}
void heapSort(int A[],int size)
{
makeHeap(A,size);
for(int i=size-1;i>0;--i)
{
swap(A[0],A[i]);
heapAdjust(A,0,i);
}
}
(2)快速排序。
代码如下:
int partiton(int A[],int low,int high)
{
int pivot=A[low];
while(low<high)
{
while(low<high&&pivot<=A[high]) --high;
A[low]=A[high];
while(low<high&&A[low]<=pivot) ++low;
A[high]=A[low];
}
A[low]=pivot;
return low;
}
void quickSort(int A[],int low ,int high)
{
if(low<high)
{
int pivot=partiton(A,low,high);
quickSort(A,low,pivot);
quickSort(A,pivot+1,high);
}
}