利用快速排序的思想,得到第K大数(代码 + 解析)

 利用快排的思想,我们可以得到 [第K大数] 的算法思想如下:

  1. 一次划分之后,得到基准值的位置,然后和K进行一些比较,便可以得知要寻找的目标在基准值左边还是右边。

  2. 此时,再对左边(或者右边)进行一次划分

  3. 循环往复直至找到为止

代码:

/*
测试数据:
0 9 1 8 2 7 3 6 4 5
1
*/
#include
#include
#include
#include
using namespace std;

int findkMax(int arr[],int low,int high,int k)
{
    int temp;
    int i = low;
    int j = high;
    if(low < high)
    {
        temp = arr[low];
        //该层循环就是一次划分的主体 
        while(i < j)
        {
            //从右边开始扫描,找到一个比它小的 
            while(j > i && arr[j] >= temp) --j;
            //将小的移到左边 
            if(i < j)
            {
                arr[i] = arr[j];
                ++i;
            }
            //从左边开始扫描,找到一个比它大的 
            while(i < j && arr[i] <= temp) ++i;
            //将大的移到右边
            if(i < j)
            {
                arr[j] = arr[i];
                --j;
            }
        }
        //此时左右指针相遇,i=j,完成一次划分,左边都比temp小, 右边都比temp大
        arr[i] = temp;//将temp置于指针相遇处
        //判断基准值哪边需要进行递归 10-k就是目标值最终所在的位置
        if(i == 10-k)
        {
            return arr[i];
        }
        else if(10-k < i)
        {
            return findkMax(arr,low,i-1,k);//左序列递归
        }
        else
        {
            return findkMax(arr,i+1,high,k);//右序列递归
        }
    }
}

int main()
{
    int arr[10];
    int k;
    for(int i = 0;i < 10;++i)
    {
        scanf("%d",&arr[i]);
    }
    scanf("%d",&k);
    printf("%d\n",findkMax(arr,0,9,k));
    return 0; 
}

 

你可能感兴趣的:(数据结构与算法分析)