查找第k小的元素-減治法


問題描述:n個數中找出第k小的元素

輸入:

9
5 3 8 1 4 6 9 2 7
4

輸出:

4

用快排思想先找出數組中第一個元素的位置(博客中有快排算法):

                     排序前:5 3 8 1 4 6 9 2 7

                     排序后:2 3 4 1 5 6 9 8 7    (5的位置確定了)

用k與元素5的下標計較,等於就輸出,小於遞歸5前的元素,大於遞歸5后的元素

代碼:

#include<iostream>

using namespace std;

void QuickSort(int *a,int left,int right,int k)
{
    int i=left;
    int j=right;

    while(i<j)
    {
        int temp;
        //從后往前比較
        while(i<j && a[i]<a[j])
            j--;
        if(i<j)
        {
            temp=a[i];
            a[i]=a[j];
            a[j]=temp;
            i++;
        }
        //從前往后比較
        while(i<j && a[i]<a[j])
            i++;
        if(i<j)
        {
            temp=a[i];
            a[i]=a[j];
            a[j]=temp;
            j--;
        }
    }
    
    if(k==i)
    {
        cout<<a[k];
        return;
    }
    else if(k<i)
    {
        QuickSort(a,left,i-1,k);
    }
    else
    {
        QuickSort(a,j+1,right,k);
    }
}
int main()
{
    int n;
    int k;
    int a[100];
    cin>>n;
    int left=1,right=n;//對應下標位置
    for(int i=1; i<=n; i++)
    {
        cin>>a[i];
    }
    cin>>k;
    QuickSort(a,left,right,k);
    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM