查詢第k小的元素 O n 遞迴解法

2021-09-22 13:24:19 字數 910 閱讀 1867

今天分享乙個小技巧,雖然是小技巧但是還是很有價值的,曾經是微軟的面試題。題目是這樣的,乙個無序的陣列讓你找出第k小的元素,我當時看到這道題的時候也像很多人一樣都是按普通的思維,先排序在去第k個,但是當陣列非常大的時候,效率不高,那有沒有簡單的方法了,其實我們早就學過,只是我們不善於思考和變通。很多人剛開始非常熱衷於各種排序演算法只是了解卻沒深究,這個題目的複雜度是o(n),原理就是快速排序裡面的劃分演算法。

分析:快速排序選擇乙個pivot對陣列進行劃分,左邊小於pivot,右邊大於等於pivot,所以我們計算左邊小於pivot(加上pivot)的個數count總共有多少,如果等於k,正是我們所要的,如果大於k,說明第k小的數在左邊,那就在左邊進行我們的遞迴;否則,在右邊,那麼說明右邊的第k-count小的數就是我們所要的,在右邊進行我們的遞迴。

**如下:

1 #include"

stdio.h"2

int getmink(int a,int n,int

k) 3

17 a[i]=temp;

18 s=i;

1920

21if(s==k)

22return

a[k];

23if(s>k) //

在左側尋找

24if(s//

在右側尋找

25}

26}

27int

main()

28;

30int k=3

; 31 printf("

第%d小元素為:(從0開始)\n%d

",k,getmink(a,10

,k));

32return

0;

33 }

查詢第k小的元素 O n 遞迴解法

今天分享乙個小技巧,雖然是小技巧但是還是很有價值的,曾經是微軟的面試題。題目是這樣的,乙個無序的陣列讓你找出第k小的元素,我當時看到這道題的時候也像很多人一樣都是按普通的思維,先排序在去第k個,但是當陣列非常大的時候,效率不高,那有沒有簡單的方法了,其實我們早就學過,只是我們不善於思考和變通。很多人...

QuickSelect 查詢第 K 小的元素

quick select演算法通常用來在未排序的陣列中尋找第 k 小 第 k 大的元素。其方法類似於quick sort。本質上是通過多次快速排序,當某次快速排序的樞紐元素恰好下標為 k 1 時,結束查詢 package main import fmt func core nums int,k,st...

有序矩陣中第K小的元素(通俗解法)

給定乙個 n x n 矩陣,其中每行和每列元素均按公升序排序,找到矩陣中第 k 小的元素。請注意,它是排序後的第 k 小元素,而不是第 k 個不同的元素。示例 matrix 1,5,9 10,11,13 12,13,15 k 8,返回 13。通俗解法 先降維,二維降維一維,然後用sort進行排序,最...