This commit is contained in:
krahets
2024-04-12 19:29:12 +08:00
parent 3dcdda193f
commit 9332a91e26
3 changed files with 38 additions and 54 deletions

View File

@ -1068,20 +1068,24 @@ comments: true
return right
}
/* 哨兵劃分 */
fun partition(nums: IntArray, left: Int, right: Int): Int {
/* 哨兵劃分(三數取中值) */
fun partitionMedian(nums: IntArray, left: Int, right: Int): Int {
// 選取三個候選元素的中位數
val med = medianThree(nums, left, (left + right) / 2, right)
// 將中位數交換至陣列最左端
swap(nums, left, med)
// 以 nums[left] 為基準數
var i = left
var j = right
while (i < j) {
while (i < j && nums[j] >= nums[left])
j-- // 從右向左找首個小於基準數的元素
j-- // 從右向左找首個小於基準數的元素
while (i < j && nums[i] <= nums[left])
i++ // 從左向右找首個大於基準數的元素
swap(nums, i, j) // 交換這兩個元素
i++ // 從左向右找首個大於基準數的元素
swap(nums, i, j) // 交換這兩個元素
}
swap(nums, i, left) // 將基準數交換至兩子陣列的分界線
return i // 返回基準數的索引
swap(nums, i, left) // 將基準數交換至兩子陣列的分界線
return i // 返回基準數的索引
}
```