查找 Kth 小的数

来源:互联网 发布:mysql 主键从0开始 编辑:程序博客网 时间:2024/06/07 06:52
查找第k小数:


(1)境界一:全部排序 :O(n*lgn+k)


先快速排序O(n*lgn),然后在找出最小的k个数。O(k)


(2)境界二:部分排序 。O(kn)


根据选择排序,每次可以取得最小的数放在开头。
/*输入:数组array,及其长度length,k;
输出: 第k小的元素 :
*/
int selectTheKthSmallest(int *array,int length,int k){
int i,j,m;


for(i=0;i<k;i++){
m=i;


for(j=i+1;j<length;j++){
if(array[j]<array[m])
m=j;
}
if(m!=i){
swap(&array[i],&array[m]);
}


}


return array[k-1];
}


(3)境界三 : 计算排序O(n),然后选择第k个数。
空间复杂度O(range).


缺陷:各个元素需要是整形的,且元素的范围
需要时0~range.


(4)境界四:快速排序扩展:O(n*lgk)


elemType findKth(elemType* array ,int length ,int k);


思想:
对于数组s[0..n-1],首先用数组中的任意一个元素(可以取第一个)将数组分为三个部分:s[0..p-1], s[p], s[p+1..n-1],其中s[0..p-1]中的值都不大于s[p],s[p+1..n-1]中的值不小于s[p]。
如果p=K-1,则s[p]是要查找的元素,返回s[p]。
如果p<K-1,则第K小的元素一定在s[p+1..n-1]中,而且是s[p+1..n-1]中的第K-p-1小的元素,你可在这一段中查找第K-p-1大的元素即可。
注意:由于数组可以看作是静态指针,所以s[p+1..n-1]可以看作是以s+p+1指向的数组,你可以在C++中使用s+p+1来表示这个数组。


代码实现:


/*选择枢纽点,返回的总是array[0] */
elemType selectPivot(elemType* array, int length){



}


elemType findKth(elemType *array,int length ,int k){

int left=0;
int right=length-1;
int pivot=selectPivot( array, length);
while(left<right){
while(left<right && array[right]>=pivot)
right--;


array[left]=array[right];

while(left<right && array[left]< pivot )
left++;


array[right]=array[left];


}
array[left]=pivot;


if(left==k-1)
return array[left];


else if(left>k-1)
return findKth(array,left,k);


else 
return findKth(s+left+1,length-(left+1),k-(left+1));


}
0 0
原创粉丝点击