每天一道算法题(32)——输出数组中第k小的数
1.题目
快速输出第K小的数
2.思路
使用快速排序的思想,递归求解。若键值位置i与k相等,返回。若大于k,则在[start,i-1]中寻找第k大的数。若小于k。则在[i+1,end]中寻找第k+start-i-1小的数。
3.代码
#include<iostream> #include<string> using namespace std; int choose(int* data,int start,int end,int k){ if(start==end) return data[start]; int temp=data[start]; int i=start; int j=end; while(i<j){//类似于快速排序的方法。 while(i<j&&data[j]>=temp) j--; data[i]=data[j]; while(i<j&&data[i]<temp) i++; data[j]=data[i]; } data[i]=temp; if((i-start+1)==k) return data[i]; else if((i-start+1)<k) return choose(data,i+1,end,k+start-i-1); else return choose(data,start,i-1,k); } int main() { int data[10]={7,4,3,2,1,10,6,5,8,9}; cout<<choose(data,0,9,8)<<endl; }