ソートアルゴリズム-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レベルです.
アルゴリズムの実装:
考え方:
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;
}
};