查询第K大的数(算法)

思路:快速排序

复制代码
public int searchK(int arr[],int n,int k){
    return find(arr,0,n-1,k);
}

public int find(int arr[],int low,int high,int k){

    int flag = sortFlag(arr,low,high);//获取排序(降序)后下标

    if(flag+1==k){//相等即返回
        return arr[falg];
    }else if(flag+1<k){//小于缩短区域寻找
        return find(arr,flag+1,high,k);
    }else{//大于缩短区域寻找
        return find(arr,low,flag-1,k);
    }
}

//快排(降序)
public int sortFlag(int arr[],int low,int high){
    int tmp = arr[low];//取一个基准值
    while(low<high){
        //指针从后往前移动,找到小于tmp值的位置
        while(low<high && arr[high]<=tmp)
            high--;
        arr[low] = arr[high];//将大的值替换到前面
        //指针从前往后移动,找到大于tmp值的位置
        while(low<high && arr[low]>=tmp)
            low++;
        arr[high] = arr[low];//将小的值替换到后面
    }
    arr[low] = tmp;
    return low;
}
复制代码

代码分析

(1)tmp=arr[low]=1,arr[high]=2;

     arr[high]>tmp,arr[low]=arr[high]

(2)arr[low]=2>=tmp,low右移

(3)arr[low]=3>=tmp,low右移

(4)arr[low]=0<tmp=1

         arr[high]=a[low]=0

(5)由于low<high,再次循环

         arr[high]=0<tmp=1,high左移

 

(6)arr[high]=9>tmp

         arr[low]=a[high]=9

 

         arr[low]=9>tmp,low右移

         low=high,跳出循环

         arr[high]=arr[low]=9

         low=3

 

 (7)low=high跳出循环

          arr[low]=tmp=1

 

 判断是否是所求的第K大,如果不是再次循环上面步骤,最终得出结果。

 

posted @   Q子  阅读(65)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示