查找第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;
}

猜你喜欢

转载自www.cnblogs.com/xxaf/p/12958237.html