查询第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大,如果不是再次循环上面步骤,最终得出结果。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~