查询第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大,如果不是再次循环上面步骤,最终得出结果。
浙公网安备 33010602011771号