思路是利用快速排序:
因為快速排序的分治思想可以將查詢的範圍縮小
快速排序的思想:
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 重新調整為最大堆。接著,將...