C++ 霍尔分区算法(Hoare‘s Partition Algorithm)

目录

[【方法】------霍尔数组划分算法------时间复杂度为 O(n),空间复杂度为 O(1)](#【方法】——霍尔数组划分算法——时间复杂度为 O(n),空间复杂度为 O(1))

一些有趣的事实


如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

给定一个数组arr\[\],任务是以第一个元素为枢轴元素对数组进行分区。

数组的划分必须满足以下两个条件:

小于枢轴元素的元素必须出现在小于或等于分区索引的索引处。

大于或等于枢轴元素的元素必须出现在大于分区索引的索引处。

分区索引等于元素个数,严格小于枢轴元素个数减一。

**注意:**可能存在多个分区数组。

例如:

输入: arr\[\] = 5, 3, 8, 4, 2, 7, 1, 10

输出: 1, 3, 2, 4 , 8, 7, 5, 10

**说明:**分区索引为 3,枢轴元素为 5,所有小于枢轴元素的元素 1, 3, 2, 4 排列在分区索引之前,大于或等于枢轴元素的元素 8, 7, 5, 10 排列在分区索引之后。

输入: arr\[\] = 12, 10, 9, 16, 19, 9

输出: 9, 10, 9 , 16, 19, 12

**说明:**分区索引为 2,枢轴元素为 12,所有小于枢轴元素 9, 10, 9 的元素都排列在分区索引之前或处,大于或等于枢轴元素 16, 19, 12 的元素都排列在分区索引之后。

【方法】------霍尔数组划分算法------时间复杂度为 O(n),空间复杂度为 O(1)

霍尔分区算法 是一种围绕枢轴元素对数组进行高效分区的方法。它基于两个指针,这两个指针分别从数组的两端出发,并向彼此移动,直到找到需要交换的元素。

算法步骤详解:

  • 将第一个元素作为枢轴,并初始化两个指针,分别指向数组的开头和结尾。i j
  • 向右移动,直到找到大于或等于枢轴的元素;向左移动,直到找到小于或等于枢轴的元素。i j
  • 如果指针指向的元素大于或等于枢轴元素,并且指针指向的元素小于或等于枢轴元素,则交换这两个元素。i j
  • 重复此过程,彼此移动并靠近,直到相遇或交叉。i j
  • 当指针交叉时,分区完成,小于或等于枢轴的元素在左侧,大于或等于枢轴的元素在右侧。

示例代码:

#include <iostream>

#include <vector>

using namespace std;

// Function to partition the array according

// to pivot index element

void partition(vector<int> &arr) {

int n = arr.size();

int pivot = arr0;

int i = -1, j = n;

while (true) {

// find next element larger than pivot

// from the left

do {

i++;

} while (arri < pivot);

// find next element smaller than pivot

// from the right

do {

j--;

} while (arrj > pivot);

// if left and right crosses each other

// no swapping required

if (i > j) break;

// swap larger and smaller elements

swap(arri, arrj);

}

}

int main() {

vector<int> arr = {5, 3, 8, 4, 2, 7, 1, 10};

partition(arr);

for (int i = 0; i < arr.size(); i++)

cout << arri << " ";

return 0;

}

输出

1 3 2 4 8 7 5 10

一些有趣的事实

霍尔分区算法通常比洛穆托分区算法更快,因为它执行的交换次数更少,并且只对数组进行一次遍历,从而在实践中实现了更好的时间复杂度。

它直接在原地工作,不需要额外的空间,这与使用临时数组的简单分区方法不同。

经过适当的调整,它可以用来实现快速排序的稳定版本,尽管它本身并不稳定。

我们可以通过交换第一个元素和最后一个元素,然后使用相同的代码,轻松地修改算法,将第一个元素(或任何其他元素)视为枢轴。

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

相关推荐
小羊没烦恼!12 分钟前
Memory 记忆设计讨论:为什么 Agent Memory 不能只靠向量数据库?
java·开发语言·windows·算法·c#
FlightYe15 分钟前
音视频修炼之编码器(一):AVC、HEVC编码器内部
android·linux·c++·音视频
羑悻的小杀马特32 分钟前
数据织网者:Jsoncpp库深度解析——从C++原生JSON处理到工程级数据交互实战全攻略
c++·json·交互·jsoncpp·原生库
ysu_03141 小时前
08-二叉树遍历:四种方式详解
c语言·数据结构·算法·leetcode
咸鱼老弟1 小时前
Speculative Decoding(投机采样):大模型"先猜后验",生成速度翻倍
前端·算法·ai编程
果果燕1 小时前
实习笔记(七)GFP自动化插拔测试功能协议解析
c++
荆棘鸟智能1 小时前
AI算法持续学习与迭代怎么做?从数据闭环到灰度发布的MLOps工程实践
人工智能·算法·架构·边缘计算
宁渡AI大模型1 小时前
河南宁渡科技有限公司|宁渡课堂 AI 全栈面试分享,AI 应用开发高频考点汇总
java·c++·人工智能·python·深度学习·神经网络·rag
Lyyaoo.1 小时前
【二分查找】【中等】搜索二维矩阵/排序数组的第一位和最后位置/搜索旋转排序数组/旋转排序数组中的最小值
java·数据结构·算法
GG-_-Bond1 小时前
9.1 kv存储内存池模拟面试问题
c++·c