Java教程

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

本文主要是介绍静态区间求第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)。

这篇关于静态区间求第K小--O(N)算法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!