C语言 Lomuto分区算法(Lomuto Partition Algorithm)

目录

[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 <stdio.h>

#include <stdlib.h>

// Function to partition the array according

// to pivot index element

void partition(int arr\[\], int n) {

int pivot = arrn - 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 (arrj < pivot) {

i++;

int temp = arri;

arri = arrj;

arrj = temp;

}

}

// place the pivot at its correct position

int temp = arri + 1;

arri + 1 = arrn - 1;

arrn - 1 = temp;

}

int main() {

int arr\[\] = {5, 13, 6, 9, 12, 11, 8};

int n = sizeof(arr) / sizeof(arr0);

partition(arr, n);

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

printf("%d ", arri);

return 0;

}

输出

5 6 8 9 12 11 13

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

辅助空间: O(1)

一些有趣的事实

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

与其他分区算法相比,它更容易理解和实现。

它通常比 Hoare 分区算法运行速度慢,尤其是在处理大型数据集或枢轴选择不当的情况下,因为

它可能需要更多的交换。

尽管效率不高,但由于其简单性,它仍然被广泛用于教育书籍中,例如Cormen 的《算法导论》一书中的快速排序算法。

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

相关推荐
youngerwang7 小时前
【从搬运工到协处理器:网卡芯片架构、算法、验证与边缘演进深度剖析】
网络·算法·架构·芯片
chase_my_dream7 小时前
C++ + SLAM 高频面试问题整理
开发语言·c++·面试
KaMeidebaby7 小时前
卡梅德生物技术快报|纯化重组蛋白实操详解
人工智能·python·tcp/ip·算法·机器学习
Cloud_Shy6187 小时前
解读《Effective Python 3rd Edition》:从练气到老魔(第五章 Item 30 - 32)
开发语言·人工智能·笔记·python·学习方法
caimouse7 小时前
Reactos 第 5 章 进程与线程 — 5.8 Windows 的 APC 机制
c语言·windows
天佑木枫8 小时前
15天Python入门系列 · 序
开发语言·python
手写码匠8 小时前
从零实现 Prompt 工程引擎:结构化提示、自动优化与多轮自省体系
人工智能·深度学习·算法·aigc
无限码力9 小时前
阿里算法岗 0530笔试真题 - 多约束条件下的元素匹配统计
算法·阿里笔试真题·阿里机试真题·阿里算法岗笔试
lqqjuly9 小时前
MLA — 多头潜在注意力深度解析
深度学习·神经网络·算法
宋拾壹9 小时前
同时添加多个类目
android·开发语言·javascript