作业2

// 主函数:在arr[left..right]中找第k小的数
function findKthSmallest_QuickSelect(arr, left, right, k):
if left == right: // 子数组只有一个元素,即为目标
return arr[left]

// 随机选择枢纽元素(避免最坏情况),交换到right位置
pivotIndex = random(left, right)
swap(arr[pivotIndex], arr[right])

// 分区:返回枢纽元素的最终位置pos(左≤枢纽,右>枢纽)
pos = partition(arr, left, right)

// 判断pos与目标位置k-1的关系
if pos == k-1:
    return arr[pos]  // 枢纽就是第k小
elif pos > k-1:
    // 目标在左半部分,递归左区间
    return findKthSmallest_QuickSelect(arr, left, pos-1, k)
else:
    // 目标在右半部分,递归右区间(需调整k值)
    return findKthSmallest_QuickSelect(arr, pos+1, right, k)

// 分区函数:以arr[right]为枢纽,将数组分为两部分
function partition(arr, left, right):
pivot = arr[right] // 枢纽元素
i = left - 1 // i标记“≤枢纽”区域的最后一个位置
for j from left to right-1:
if arr[j] ≤ pivot: // 若元素≤枢纽,加入左区域
i += 1
swap(arr[i], arr[j])
// 将枢纽放到最终位置(i+1)
swap(arr[i+1], arr[right])
return i + 1 // 返回枢纽位置

posted @ 2025-11-11 11:39  想砂糖桔地铁  阅读(2)  评论(0)    收藏  举报