問題描述:
給定線性序集中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部落格。作為乙個大型的 資料的加工處理需要用到很多演算法系統模組,通過這些模組對系統主資料...