查詢無序數中最大k個數

2021-07-02 00:39:11 字數 1979 閱讀 9883

解法一:該解法是大部分能想到的,也是第一想到的方法。假設資料量不大,可以先用快速排序或堆排序,他們的平均時間複雜度為o(n*logn),然後取出前k個,時間複雜度為o(k),總的時間複雜度為o(n*logn)+o(k).

當k=1時,上面的演算法的時間複雜度也是o(n*logn),上面的演算法是把整個陣列都進行了排序,而原題目只要求最大的k個數,並不需要前k個數有限,也不需要後n-k個數有序。可以通過部分排序演算法如選擇排序和交換排序,把n個數中的前k個數排序出來,複雜度為o(n*k),選擇哪乙個,取決於k的大小,在k(k

解法二:(掌握)避免對前k個數進行排序來獲取更好的效能(利用快速排序的原理)。

假設n個數儲存在陣列s中,從陣列中隨機找乙個元素x,將陣列分成兩部分sa和sb.sa中的元素大於等於x,sb中的元素小於x。

出現如下兩種情況:

(1)若sa組的個數大於或等於k,則繼續在sa分組中找取最大的k個數字 。

(2)若sa組中的數字小於k ,其個數為t,則繼續在sb中找取 k-t個數字 。

一直這樣遞迴下去,不斷把問題分解成小問題,平均時間複雜度為o(n*logk)。

**如下:

void partition(int a, int s,int t,int &k) 

while(i

a[i]=x; //劃分元素就位 

k=i; 

} /*查詢陣列前k個最大的元素,index:返回陣列中最大元素中第k個元素的下標(從0開始編號),high為陣列最大下標*/

int findkmax(int a,int low,int high,int k)

return index;

}int main()

; int len=sizeof(a)/sizeof(int); 

int k=4;

findkmax(a , 0 , len- 1 , k) ; 

for(int i = 0 ; i < k ; i++) 

cout<

return 0;}

複製**

解法三:(掌握)用容量為k的最小堆來儲存最大的k個數。最小堆的堆頂元素就是最大k個數中的最小的乙個。每次掃瞄乙個資料x,如果x比堆頂元素y小,則不需要改變原來的堆。如果x比堆頂元素大,那麼用x替換堆頂元素y,在替換之後,x可能破壞了最小堆的結構,需要調整堆來維持堆的性質。調整過程時間複雜度為o(logk)。 全部的時間複雜度為o(n*logk)。

這種方法當資料量比較大的時候,比較方便。因為對所有的資料只會遍歷一次,第一種方法則會多次遍歷陣列。 如果所查詢的k的數量比較大。可以考慮先求出k` ,然後再求出看k`+1 到 2 * k`之間的資料,然後一次求取。

void heapifymin(int array,int i,int size)

if(right

//開始交換父結點和最大的子結點

if(smallest!=i)}}

//建堆過程,建立最小堆,從最後乙個結點開始調整為最小堆

void min_heapify(int array,int size)

//k為需要查詢的最大元素個數,size為陣列大小,kmax儲存k個元素的最小堆

void findmax(int array,int k,int size,int kmax)}}

int main()

;int length=sizeof(a)/sizeof(int);

//最大四個元素為23,52,35,12

/***************查詢陣列中前k個最大的元素****************/

int k=4;

int * kmax=(int *)malloc(k*sizeof(int));

findmax(a,k,length,kmax);

printf("最大的%d個元素如下所示 : \n",k);

for(int i=0;i

printf("%4d",kmax[i]);

printf("\n");

return 0;}

複製**

無序陣列中最小的k個數

對於乙個無序陣列,陣列中元素為互不相同的整數,請返回其中最小的k個數,順序與原陣列中元素順序一致。給定乙個整數陣列a及它的大小n,同時給定k,請返回其中最小的k個數。測試樣例 1,2,4,3 4,2返回 1,2 簡單題 coding utf 8 class kthnumbers def findkt...

找到無序陣列中最小的k個數

找到無序陣列中最小的k個數 給定乙個整型陣列arr,找到其中最小的k個數。輸入描述 輸入包含兩行,第一行包含兩個整數n和k 1 k n 105 1 leq k leq n leq 10 5 1 k n 105 代表陣列arr的長度,第二行包含n個整數,代表陣列arr 1 a rri 109 arr ...

8 4找到無序陣列中最小的k個數

題目 給定乙個無序的整型陣列arr,找到其中最小的k個數。時間複雜度至少為o nlogk 實現public int getminknumsbyheap int arr,int k int kheap newint k 代表目前被選出的k個最小的數 for int i 0 i k i for int ...