静态区间求第K小--O(N)算法

题目:给定一组数,求该组数中第k大的数

思路:可以借鉴快速排序算法,选取基准值后在一遍扫描后会把基准值放在其最终所在的位置。在此时判断基准值的位置在k的左边还是右边,从而选择不同方向的递归求解第k大。

inline void sort(int *s,int begin,int end,int k){
	if(flag) return;
	if(end<=begin) return;
	int temp=s[begin];
	int i=begin,j=end;
	while(i<j){
		while(s[j]>=temp&&i<j) j--;
		while(s[i]<=temp&&i<j) i++;
		swap(s[i],s[j]);
	}
	s[begin]=s[i];
	s[i]=temp;
	if(i==k) {flag=true;return;}
	else if(i<k) {sort(s,i+1,end);}
	else {sort(s,begin,i-1);}
	if(flag) return;
}

在递归结束之后,第k大的数就是s[k]。

时间复杂度:平均时间复杂度为 O ( N ) O(N) O(N),最差时间复杂度为 O ( N 2 ) O(N^2) O(N2)。

上一篇:C++的sort函数


下一篇:数学之美读书日记