分治演算法 尋找第k大數

2021-08-18 16:14:25 字數 1136 閱讀 8365

問題描述:

給定線性序集中n個元素和乙個整數k,1≤k≤n,要求找出這n個元素中第k大的元素,(這裡給定的線性集是無序的)。

其實這個問題很簡單,直接對線性序列集qsort,再找出第k個即可。但是這樣的時間複雜度就是qsort的時間複雜度o(nlogn)。有沒有更快的方法呢?看到網上有一種解法是採取了快排的思路,但是稍微坐了些改動,然後時間複雜度能夠接近o(n)。因為最近剛剛寫了快排的實現,所以在這我就再把這個實現一次吧。

解題思路:與快排不同的是,這裡只對劃分出來的其中一組進行遞迴處理。任意選定乙個pivotindex,pivotvalue = arr[pivotindex]。經過一次劃分後,pivotvalue儲存在storeindex的位置,storeindex把陣列劃分為兩部分。比pivotevalue大的在前面,比pivotvalue小的儲存在後面(此時前後兩部分是沒有排好序的)。那麼storeindex位置的pivotvalue就肯定是第storeindex大的數。然後用k於storeindex比較,如果kstoreindex,那麼說明第k大一定在左邊,那麼再對左邊進行劃分。然後遞迴,最後就可以得到第k大。

#include void swap(int *a, int *b)

int partition(int arr, int left, int right, int

pivotindex)

}swap(&arr[storeindex],&arr[right]);

return

storeindex;

}int findkmax(int arr, int left, int right, int

k)

else

if (nret >k)

return

nret;

}int

main()

; scanf("%d

",&k);

nret = findkmax(arr,0,7,k-1

);

printf(

"the kth max number locate in %d is :%d\n

",nret,arr[nret]);

for (i = 0; i < 8; i++)

return0;

}

分治演算法 尋找第k大數

問題描述 給定線性序集中n個元素和乙個整數k,1 k n,要求找出這n個元素中第k大的元素,這裡給定的線性集是無序的 其實這個問題很簡單,直接對線性序列集qsort,再找出第k個即可。但是這樣的時間複雜度就是qsort的時間複雜度o nlogn 有沒有更快的方法呢?看到網上有一種解法是採取了快排的思...

分治演算法 尋找第k大數

問題描述 給定線性序集中n個元素和乙個整數k,1 k n,要求找出這n個元素中第k大的元素,這裡給定的線性集是無序的 其實這個問題很簡單,直接對線性序列集qsort,再找出第k個即可。但是這樣的時間複雜度就是qsort的時間複雜度o nlogn 有沒有更快的方法呢?看到網上有一種解法是採取了快排的思...

尋找第k大數字

sicily description 經過長時間的籌備工作,在jourk,ronny,plipala,阿長,阿沈等人的努力下,dm實驗室建立起自己的系列 其中包括三個大板塊 dmoj首頁 dmoj論壇 dmoj部落格。作為乙個大型的 資料的加工處理需要用到很多演算法系統模組,通過這些模組對系統主資料...