215 陣列中的第K個最大元素 快速排序

2022-06-05 21:00:09 字數 2386 閱讀 3464

215. 陣列中的第k個最大元素

思路:快速排序

演算法思想: 對給定陣列中的元素進行重新排列, 確定陣列中元素的乙個位置q, 得到乙個快速排序的劃分

quicksort功能,將陣列a的a[p]到a[q]變為有序(比如從小到大)

quicksort(a, p, r)

ifp < r

thenq \(\leftarrow\) partition(a, p, r)

​ quicksort(a, p, q)

​ quicksort(a, q + 1, r)

partition在a[p]到a[r]以a[p]為界劃分成兩部分a[p]的左邊比a[p]小,a[p]的右邊比a[p]大

(1)快速排序演算法複雜性分析

快速排序演算法的執行時間依賴於:

最壞時間複雜性

quicksort 的最壞情況發生在partition 輸出的兩個區域中, 乙個僅包含1 個元素, 另乙個包含n - 1個元素的情況;假設上述不平衡的劃分發生在演算法的每一步迭代中, 則

排序過程中每次都出現上述情況就是最壞情況

\[t(n) =

\begin

o(1)&\text \leq \\[2ex]

t(n - 1) + o(n)&\text\\[2ex]

\end

\]

每次問題的規模只減小了1,易知時間複雜度為\(o(n^2)\)

最優時間複雜性

設如果partition 演算法產生兩個大小為n=2 的區域,則

\[t(n) = 2t(\frac) + o(n)

\]根據主定理, 可以得出

\[t(n) = o(n log n)

\](2)隨機化快速排序演算法

randomized-quicksort演算法

randomized-quicksort(a, p, r)

ifp < r

thenq =randomized-patition(a, p, r)

​ randomized-quicksort(a, p, q)

​ randomized-quicksort(a, q + 1, r)

randomized-partition演算法

randomized-partition(a, p, r)

​ i=random(p, r)

exchangea[p] \(\leftrightarrow\) a[i]

returnpartition(a, p, r)

package main

import (

"fmt"

"math/rand"

)func findkthlargest(nums int, k int) int

p := partition(nums,left,right)

if p == lengthelse if p=x && j>left

for nums[i]<=x && i

if i

} t := nums[left]

nums[left],nums[j] = nums[j],t

return j

}func main()

fmt.println(findkthlargest(nums,2))

}

215 陣列中的第K個最大元素

題目 方法一 二 時間複雜度 o n logk 向大小為k的堆中新增元素的時間複雜度為o logk 我們將重複該操作n次 空間複雜度 o k 用於儲存k個堆元素 自己解答 速度太慢?有待提高 time 2019 10 9 下午01 04 file 陣列中第k大元素 215.py 在未排序的陣列中找到...

215 陣列中的第K個最大元素

思路1 快排 考慮先使用快排實現,練習快排。時間複雜度o n 如果我們把每次分割槽遍歷的元素個數加起來,就是 n n 2 n 4 n 8 1。這是乙個等比數列求和,最後的和等於 2n 1。所以,時間複雜度就為 o n 因為一次快排可以實現乙個數歸位,比較index和n k的大小 如果index n ...

215 陣列中的第K個最大元素

在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。輸入 3,2,1,5,6,4 和 k 2 輸出 5 輸入 3,2,3,1,2,4,5,5,6 和 k 4 輸出 4 你可以假設 k 總是有效的,且 1 k 陣列的長度。思路和演...