寻找数组中前K个最小的数-堆排序

利用堆排序求数组中最小的k个数:

void adjustHeap(vector<int> &arr,int N,int i)
{
    ///构建小顶堆
    int j = 2*i;
    if(j<N && arr[j+1]<arr[j])
        j++;
    if(j<N && arr[j]<arr[i])
    {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
        adjustHeap(arr,N,j);
    }
}

vector<int> heapSort(vector<int> &arr,int N,int k)
{
    vector<int> result;
    for(int i=N/2-1;i>=0;i--)
        adjustHeap(arr,N,i);

    ///只循环k次,每次讲堆顶的数取出
    for(int i=N-1;i>k;i--)
    {
        int temp = arr[i];
        arr[i] = arr[0];
        arr[0] = temp;
        result.push_back(arr[i]);
        adjustHeap(arr,i,0);
    }
    return result;
}

int main()
{
    int a[8] = {9,20,-3,43,21,555,-210,90};
    vector<int> arr(a,a+8); 
    cout<<"排序前:\n";
    for(int i=0;i<8;i++)
        cout<<arr[i]<<" ";
    cout<<endl;
    ///假设求最小的3个数
    vector<int>result = heapSort(arr,8,3);
    cout<<"排序后:\n";
    for(int i=0;i<3;i++)
        cout<<result[i]<<" ";
    cout<<endl;

    system("pause");
    return 0;
}

这里写图片描述

猜你喜欢

转载自blog.csdn.net/sinat_21107433/article/details/81782307
今日推荐