分治算法找第k小的数
分治算法找第k小的数的基本思路是利用快速选择
- 选择基准:从数组中随机选择一个元素作为基准
- 划分数组:将数组划分为三部分:
- 小于基准的部分
- 等于基准的部分
- 大于基准的部分
- 判断位置:
- 如果小于基准的部分的大小等于k-1,则基准就是第k小的数。
- 如果小于基准的部分的大小大于k-1,则在小于基准的部分递归查找第k小的数。
- 如果小于基准的部分的大小小于k-1,则在大于基准的部分递归查找第k - (小于部分大小 + 1)小的数。
伪代码
int fenzhi(a[], left, right, k){
if left == right; // 数组中只有一个元素
return a[left];}
a = b(a[], left, right)
size = a - left + 1
if (size == k)// 基准正好是第k小的数
{ return a[a]}
else if (size > k){ // 第k小的数在左侧
return fenzhi(arr, left, a - 1, k);}
else // 第k小的数在右侧
return quickSelect(a[], a + 1, right, k - size);
时间复杂度
最好时间复杂度:O(n),在每次划分时都能恰好将数组分成两半的情况下。
最坏时间复杂度:O(n²),在每次选择基准时都选到最小或最大元素,导致每次只减少一个元素。
分治法的体会
分治法通过将问题分解为更小的子问题,简化了复杂问题的解决方案。这个策略不仅提高了效率,还让算法更易于理解和实现。在查找第k小的数时,分治法充分利用了数组的局部结构,避免了完整排序,从而提升了性能。通过随机选择基准来减少最坏情况的发生,提高了算法的平均性能。这种方法在解决许多其他问题时也具有广泛的应用,如排序和搜索。
705

被折叠的 条评论
为什么被折叠?



