top K 问题的解法

问题:输入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);
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值