快速排序 尋找無序陣列中的第k大的數

2021-10-05 16:07:11 字數 1517 閱讀 7992

思路是利用快速排序:

因為快速排序的分治思想可以將查詢的範圍縮小

快速排序的思想:

low為陣列的起始點,high為陣列的尾部點。交替掃瞄

1.固定陣列的第乙個數為定點,從陣列的尾部high開始往左查詢,直到第乙個比定點小的數,和定點交換,因此當前點為空(high)

2.從陣列的起始處,low找到第乙個比定點大的數,賦值給high的位置

3.最後一層迴圈過後,low的位置是空缺的,補充定點的值。

遞迴分而治之

def quick_sort(tmp_list,start,end):

if(start>=end):

return

low=start

high=end

tmp=tmp_list[start]

print('high:%d,low:%d,index:%d'%(high,low,tmp))

while(high>low):

while high>low and tmp_list[high]>=tmp:

high=high-1

tmp_list[low]=tmp_list[high]

while high>low and tmp_list[low]<=tmp:

low=low+1

tmp_list[high]=tmp_list[low]

tmp_list[low]=tmp

print('high:%d,low:%d'%(high,low))

quick_sort(tmp_list,start,low-1)

quick_sort(tmp_list,low+1,end)

第k大的值需要判斷在當前定點的前面還是後面,如果是等於那就不費事了,不等於的話大於定點就要去後面找,小於需要去前面找

def findkth(tmp_list,start,end,k):

if(start>=end):

return

low=start

high=end

tmp=tmp_list[start]

while(high>low):

while high>low and tmp_list[high]>=tmp:

high=high-1

tmp_list[low]=tmp_list[high]

while high>low and tmp_list[low]<=tmp:

low=low+1

tmp_list[high]=tmp_list[low]

tmp_list[low]=tmp

if low==k:

return tmp_list[low]

elif low>k:

return findkth(tmp_list,start,low-1,k)

elif lowreturn findkth(tmp_list,low+1,end,k)

else:

return -999

尋找無序陣列的第K項(分治)

尋找n個數的第k項只需要對它們進行排序,然後找到即可。但是耗時o nlongn 在書上看到了很好的方法,想著實現一下 輸入 乙個數列a,乙個整數k 輸出 數列a中第k小的數 我們假定陣列的乙個數v,現在把陣列a分成三份。a2 a3 例如任意乙個陣列a 假設v等於5 a1 2 4 1 a2 5 5 a...

尋找單個無序陣列中第K小的數字

1 排序 對陣列進行排序 然後前k個元素就是需要查詢的元素,排序的方法可以採用快速排序,但是我們知道在快速 排序中如果已經是有序的陣列,採用快速排序的時間複雜度是o n 2 為了解決這種問題,通常選擇隨機選擇乙個 陣列值pivot作為基準,將陣列分為s1 pivot和s2 pivot,這樣就能避免快...

從無序陣列中找出第K大的數

該題目的兩種實現方式,第一種是用堆排序 其中陣列用到了二叉樹的性質 第二種是利用快速排序來實現.最大堆進行公升序排序,主要步驟是 1.初始化堆 將數列a 1.n 構造成最大堆。2.交換資料 將a 1 和a n 交換,使a n 是a 1.n 中的最大值 然後將a 1.n 1 重新調整為最大堆。接著,將...