C++ (Naive Partition Algorithm)朴素划分算法

目录

一种简单的数组分区方法

一些有趣的事实


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

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

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

数组中小于或等于枢轴元素的元素排在枢轴元素之前。

数组中大于枢轴元素的元素会出现在枢轴元素之后。

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

例如:

输入: arr\[\] = 5, 13, 6, 9, 12, 11, 8

输出: 5, 6, 8 , 13, 9, 12, 11

**说明:**所有小于枢轴元素 5, 6 的元素都排列在枢轴元素 5, 6 之前,所有大于枢轴元素 13, 9, 12, 11 的元素都排列在枢轴元素 13, 9, 12, 11 之后。

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

输出: 4, 9, 8, 9 , 10, 16, 19

**说明:**所有小于或等于枢轴元素 4, 9, 8 的元素都排列在其前面,所有大于枢轴元素 10, 16, 19 的元素都排列在其后面。

一种简单的数组分区方法

一种简单的数组分区 方法是创建一个新的临时数组来存储重新排列后的元素。在这种方法中,我们首先遍历原始数组,并将所有小于或等于基准元素的元素添加到临时数组中。然后,我们将基准元素添加到临时数组中。最后,我们将大于基准元素 的元素填充到临时数组的剩余部分。

这样可以确保较小的元素位于枢轴* 元素之前,较大的元素位于枢轴元素之后。现在,将临时数组中的元素复制回原始数组。*

示例代码:

// C++ program to partition the array

// using naive partition approach

#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();

// Last element will be the pivot value

int pivot = arrn - 1;

// create a temp array to store the elements in order

vector<int> temp(n);

int idx = 0;

// First fill element smaller than or equal to

// pivot, into the temp array

for (int i = 0; i < n; i++) {

if (arri <= pivot)

tempidx++ = arri;

}

// Now fill the elements greater than pivot

for (int i = 0; i < n; i++) {

if (arri > pivot)

temp idx++ = arri;

}

// copy the elements from temp to arr

arr = temp;

}

int main() {

vector<int> arr = {5, 13, 6, 9, 12, 11, 8};

partition(arr);

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

cout << arri << " ";

return 0;

}

输出

5 6 8 13 9 12 11

时间复杂度: O(n),用于数组遍历;

辅助空间复杂度: O(n),因为它使用了临时数组。

一些有趣的事实

它是一种稳定的分区算法,这意味着它可以保持重复元素的相对顺序。我们可以通过使用它来使快速排序保持稳定。

它比其他分区算法慢,因为它需要多次遍历数组,并且需要额外的空间来存储元素。

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

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

相关推荐
牛油果子哥q23 分钟前
C++内存池与对象池精讲:内存碎片、自定义分配器、对象池实现、STL allocator原理、工程落地与性能对比
java·开发语言·c++
万法若空42 分钟前
C/C++ 类型别名定义方式对比
java·c语言·c++
啥都想学点的研究生1 小时前
一篇文章讲清楚:线性回归问题的求解——正规方程法
算法·机器学习·线性回归
青少儿编程课堂1 小时前
树状数组精讲:逆序对计数与离散化(附双语言解法)
算法·树状数组·离散化·信息学奥赛·逆序对
血小板要健康2 小时前
网格 dfs 与 FloodFill:从岛屿、区域到搜索路径
笔记·算法·leetcode·深度优先
VALENIAN瓦伦尼安教学设备2 小时前
设备状态检测振动分析实训台案例分析
大数据·数据库·人工智能·嵌入式硬件·算法
小小晓.2 小时前
C++ 值类别与完美转发深度剖析:从左值右值到 std::forward 源码解密
开发语言·c++·算法
怕浪猫2 小时前
用了两年 AI 编程工具后,我重新理解了什么是「资深工程师」
算法·面试·架构
hetao17338373 小时前
2026-08-27~29 hetao1733837 的刷题记录
c++·算法
chen<>3 小时前
C++ 六种 memory_order:从原子性到线程间可见性.md
java·linux·开发语言·c++