//用快速排序來寫的 這裡一定要明確每個變數的定義,不然很容易出錯
class solution
//在[l,r]之間尋找第k大個元素
private:
int findkthlargest( vector& nums, int l, int r, int k )
//返回p使得 [0,p]都小於/等於nums[0], (p,r] 都大於nums[0]
int partition( vector& nums, int l, int r)
}swap( nums[l], nums[j] ); //最後這一步交換不要忘記了
(雖然用時高的離譜。。。)
注意事項
1快速排序是乙個遞迴的演算法,一定要有乙個遞迴到底的判斷 即上面的if( l > r) return -1;
2快速排序是乙個遞迴的演算法,所以
if( n > minindex )
return findkthlargest(nums, 0, n-1, k);
這裡的return
不能忘記,如果不return的話這一步的值就沒法帶回去
並且在partition中,由於是遞迴的演算法,陣列的下標就並不都是從0開始的了,所以在交換的時候,不能用swap( nums[0], nums[ l ] );
,要先用 j將原來的第乙個元素l儲存起來,然後用swap( nums[ l ], nums[j] );
3k的值並不隨著遞迴的變化而變化,因為每次只是擷取陣列的一小部分來看,此時陣列的下標沒變,k在新陣列中的下標也是沒有變化的
4一定要明確好變數的定義,這樣寫的時候才不會寫錯!
基於leetcode215題的對於排序演算法的思考
在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。樣例示例 1 輸入 3,2,1,5,6,4 和 k 2 輸出 5 示例 2 輸入 3,2,3,1,2,4,5,5,6 和 k 4 輸出 4 說明 你可以假設 k 總是有效的,且...
LeetCode 215 陣列中的第K個最大元素
在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。示例 1 輸入 3,2,1,5,6,4 和 k 2 輸出 5 示例 2 輸入 3,2,3,1,2,4,5,5,6 和 k 4 輸出 4 說明 你可以假設 k 總是有效的,且 1...
LeetCode 215 陣列中的第K個最大元素
在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。示例 1 輸入 3,2,1,5,6,4 和 k 2 輸出 5 示例 2 輸入 3,2,3,1,2,4,5,5,6 和 k 4 輸出 4 說明 你可以假設 k 總是有效的,且 1...