目录
[Lomuto 算法用于数组划分](#Lomuto 算法用于数组划分)

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。
给定一个数组,任务是以最后一个元素为枢轴元素对数组进行分区。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, 16, 19, 9]
输出: [4, 9 , 9, 10, 16, 19]
**说明:**所有小于枢轴元素 [4] 的元素都排列在枢轴元素之前,所有大于或等于枢轴元素 [9, 10, 16, 19] 的元素都排列在枢轴元素之后。
Lomuto 算法用于数组划分
Lomuto分割算法 基于一个枢轴元素对数组进行分割。一个指针标记小于枢轴元素的元素的边界,另一个指针则用于数组遍历。遍历数组时,较小的元素被移动到边界的左侧,边界不断扩展。遍历完成后,边界左侧的所有元素都小于枢轴元素,而边界右侧的所有元素都大于枢轴元素。
算法步骤详解:
- 选择数组的最后一个元素作为枢轴 。
- 在数组的开头初始化指针;该指针将作为小于或等于枢轴元素 的元素的边界。i
- 使用指针遍历数组,检查每个元素:j arr[j]
- 如果<= pivot ,则交换以将较小的元素向左移动,并增加以调整边界。arr[j] arr[i]arr[j]i
- 遍历之后,小于或等于枢轴的元素将位于数组的开头,并标记边界。i
- 最后,arr[i]与枢轴元素 (最后一个元素)交换位置,将枢轴元素放置在正确的位置。






示例代码:
// C++ program to partition the array
// using Lomuto Partition Algorithm
#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 = arr[n - 1];
// i acts as boundary between smaller and
// larger element compared to pivot
int i = -1;
for (int j = 0; j < n; j++) {
// If smaller element is found expand the
// boundary and swapping it with boundary element.
if (arr[j] < pivot) {
i++;
swap(arr[i], arr[j]);
}
}
// place the pivot at its correct position
swap(arr[i + 1], arr[n - 1]);
}
int main() {
vector<int> arr = {5, 13, 6, 9, 12, 11, 8};
partition(arr);
for (int i = 0; i < arr.size(); i++)
cout << arr[i] << " ";
return 0;
}
输出
5 6 8 9 12 11 13
时间复杂度: O(n),用于数组遍历。
辅助空间: O(1)
一些有趣的事实
我们可以通过交换第一个元素和最后一个元素,然后使用相同的代码,轻松地修改算法,将第一个元素(或任何其他元素)视为枢轴。
与其他分区算法相比,它更容易理解和实现。
它通常比 Hoare 分区算法运行速度慢,尤其是在处理大型数据集或枢轴选择不当的情况下,因为
它可能需要更多的交换。
尽管效率不高,但由于其简单性,它仍然被广泛用于教育书籍中,例如Cormen 的《算法导论》一书中的快速排序算法。
如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。