查找 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));
}
(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
- 查找 Kth 小的数
- 230. Kth Smallest Element in a BST | 二叉排序树中查找第K小的数
- 378. Kth Smallest Element in a Sorted Matrix(查找矩阵中第k小的数)
- 查找问题整理(2)查找第K大的数Kth Order Statitic
- LeetCode 二分查找第K大的数215. Kth Largest Element in an Array
- 小算法-----查找缺失的数
- 在集合中查找第K小的数
- 【算法】查找第k小的数【JS实现】
- 查找给定区间内第K大/小的数
- O(n)查找第k小(大)的数
- 查找一个数组中第k小的数
- leetcode 215:Kth Largest Element in an Array ( 分治-求第k小的数,第k大的数)
- 算法之查找第k小的数和查找最小的k个元素
- 有序矩阵中查找第k小的元素 Kth smallest element in a row-wise and column-wise sorted 2D array
- 二分查找 找一个比目标数小的最大数
- DSOJ Kth Number(第k大的数)
- 查找缺失的数
- 查找重复的数
- jQuery.pushStack的深入讲解
- 深入浅出Cocoa之Bonjour网络编程
- Maven深入
- 数字基root
- ValidateRequest="false" 无效
- 查找 Kth 小的数
- 外设实战之搭建开发环境
- 多重继承
- html键盘松开事件
- AOP思想
- vs 只能调试不能运行问题的解决
- android ethernet dhcp概率性获取不到ip的解决方法
- sql server企业管理器中设置数据为null
- 一网打尽当下NoSQL类型、适用场景及使用公司