使用快排思想找第k大的數,演算法複雜度o(n)。
1.以陣列a的第0位a[0]為參考基準base,將陣列劃分為兩個部分;
如果找第k大的數,則將大於base的數往前挪,將小於base的數往後挪。如果找第k小的數,則與此相反。
劃分過程與快排相同,使用兩個指標i和j分別指向陣列的首尾,根據指標所指元素與基準base的大小交替移動兩個指標,直到兩個指標指向同乙個位置i==j,此時i或j即為base的下標.
2.當k-1大於base的索引i(或j)時,所要找的第k大的數字於base的後半部分,需要對後半部分進行排序,而不用管前半部分的順序;
當k-1小於base的索引時,所要找的第k大的數字於base的前半部分,只需要對前半部分進行排序;
當k-1等於base的索引時,說明當前的base就是所要找的第k大的數。
使用遞迴方法對所需要排序的部分進行排序。
#include
#include
using
namespace
std;
// 找第k小的數
void findkthsmaller(vector
&a, int k, int m,int n)
if(a[j]while(iif(a[i]>=base)
}a[i]=base;
if(k-1
1); }
else
if(k-1>i)
else
return;
}// 找第k大的數
// m,n表示所需要排序部分的首尾索引
void findkthbigger(vector
&a, int k, int m,int n)
if(iif(k-1 > i)
if(k-1
< i)
else
return;
}int main()
findkthbigger(a,k,0,n-1);
for(int i=0;icout
<" ";
}cout
<< endl;
cout
<< a[k-1] << endl;
return
0;}
快排的思想求第K小的數
描述輸入n 個數,m 次查詢。每次查詢給出乙個數x。要求 每次查詢輸出前 x個數中第 i小的數。i為第 i次查詢 你可以假設 m n xi xi 1 xi 2 xm xm n 輸入 line0 t line1 n,m line2 linen 1 num1,numn linen 2 linen 2 m...
尋找第K大的數
題目描述 要求在n個不重複的整數中,找出第k大的整數 其中0輸入第一行為兩個正整數n k 第二行為n個整數,輸入保證這n個整數兩兩相異,每個整數的範圍在 1000000到1000000之間 輸出輸出第k大的整數值 樣例輸入 5 33 2 4 5 1 樣例輸出 3 如下 include include...
尋找第K大的數
在一堆資料中查詢到第k個大的值。名稱是 設計一組n個數,確定其中第k個最大值,這是乙個選擇問題,解決這個問題的方法很多。所謂 第 前 k大數問題 指的是在長度為n n k 的亂序陣列中s找出從大到小順序的第 前 k個數的問題。解法1 我們可以對這個亂序陣列按照從大到小先行排序,然後取出前k大,總的時...