分治演算法 尋找第k大數

2021-09-07 21:57:31 字數 1678 閱讀 8409

問題描述:給定線性序集中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;

} 2013/6/17

19:55

蕭蕭空間列出了很多種尋找第k大數的演算法。

第二次實現該演算法:

#include void swap(int arr, int i, int

j)int partition(int arr, int left, int

right)

p_cmp++;

}swap(arr,p_insert,right);

return

p_insert;

}void max_k(int arr, int left, int right,int

k)int

main()

;

int i,k = 5

; max_k(arr,

0,8,k);

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

printf("\n

");return0;

}2013/10/21

22:42

分治演算法 尋找第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部落格。作為乙個大型的 資料的加工處理需要用到很多演算法系統模組,通過這些模組對系統主資料...