ソートアルゴリズム-K番目の大きい数

1397 ワード

1つのリストの中でK番目に大きい数を求める場合は、まずソートしてから抽出することができるが、複雑度はnlognがあり、もちろんtopKを求めるようにスタックソートや選択ソートやバブルソートを利用することもできるが、スタックソートにはKlognがあり、他の2つはそれぞれKNであり、高速ソートで改善すれば時間複雑度はNレベルに下げることができる.
考え方:
partitionが完了するたびに、統計が基準値より大きい要素の個数nが、n>kの場合、大きな側でKth valueを探し続け、そうでなければ小さい側でk-n th valueを探します.複雑度はn+n/2+n/4+.+にほぼ等しい1はNレベルです.
アルゴリズムの実装:
class Solution{
public:
	int get_k_val(vector & data_list, int k){
		int low = 0;
		int high = data_list.size() - 1;
		int k_val = get_k_in_range(data_list, low, high, k);
		return k_val;
	}
	int get_k_in_range(vector &data_list, int low, int high,int k){
		if (low >= high){
			return data_list[low];
		}
		int mid = partition(data_list, low, high);
		if (high - mid + 1 > k){
			return get_k_in_range(data_list, mid+1, high, k);
		}
		else if(high-mid+1 &data_list, int low, int high){
		int flag_val = data_list[low];
		int i = low;
		int j = high + 1;
		while (1){
			while (data_list[++i] < flag_val){ if (i>=high) break; }
			while (data_list[--j] > flag_val){ if (j <= low) break; }
			if (i >= j){
				break;
			}
			int temp = data_list[j];
			data_list[j] = data_list[i];
			data_list[i] = temp;
		}
		data_list[low] = data_list[j];
		data_list[j] = flag_val;
		return j;
	}
};