C语言 (QuickSort using Random Pivoting)使用随机枢轴的快速排序

本文将探讨如何使用随机枢轴实现快速排序。在快速排序中,我们首先对数组进行原地分割,使得枢轴元素左侧的所有元素都小于枢轴元素,而右侧的所有元素都大于枢轴元素。然后,我们递归地对左右两个子数组执行相同的分割过程。

与归并排序不同,快速排序不需要合并两个已排序的数组。因此,快速排序所需的辅助空间比归并排序更少,这也是它通常优于归并排序的原因。使用随机生成的枢轴可以进一步降低快速排序的时间复杂度。

我们已经讨论了两种流行的数组划分方法------霍尔划分方案和洛穆托划分方案

建议读者已经阅读过这篇文章,或者知道如何使用这两种划分方案中的任何一种来实现快速排序。

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

基于 Lomuto 分区的随机枢轴算法

partition(arr\[\], lo, hi)

pivot = arrhi

i = lo // 用于交换的位置

for j := lo to hi -- 1 do

if arrj <= pivot then

swap arri with arrj

i = i + 1

swap arri with arrhi

return i

partition_r(arr\[\], lo, hi)

r = Random Number from lo to hi

Swap arrr and arrhi

return partition(arr, lo, hi)

quicksort(arr\[\], lo, hi)

if lo < hi

p = partition_r(arr, lo, hi)

quicksort(arr, lo , p-1)

quicksort(arr, p+1, hi)

++使用 Lomuto 分区法实现:++

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

int partition(int arr\[\], int low, int high)

{

int pivot = arrlow;

int i = low - 1, j = high + 1;

while (1) {

do {

i++;

} while (arri < pivot);

do {

j--;

} while (arrj > pivot);

if (i >= j)

return j;

int temp = arri;

arri = arrj;

arrj = temp;

}

}

int partition_r(int arr\[\], int low, int high)

{

srand(time(0));

int random = low + rand() % (high - low);

int temp = arrrandom;

arrrandom = arrlow;

arrlow = temp;

return partition(arr, low, high);

}

void quickSort(int arr\[\], int low, int high)

{

if (low < high) {

int pi = partition_r(arr, low, high);

quickSort(arr, low, pi);

quickSort(arr, pi + 1, high);

}

}

void printArray(int arr\[\], int n)

{

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

printf("%d ", arri);

printf("\n");

}

int main()

{

int arr\[\] = { 10, 7, 8, 9, 1, 5 };

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

quickSort(arr, 0, n - 1);

printf("Sorted array: \n");

printArray(arr, n);

return 0;

}

输出

复制代码
已排序数组:
1 5 7 8 9 10

时间复杂度: O(N*N)
辅助空间: O(N) // 由于递归调用栈

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

相关推荐
yuan1999718 分钟前
欧拉梁静力与屈曲计算的 MATLAB 实现(有限差分法 + 解析解)
开发语言·算法·matlab
玖玥拾42 分钟前
C/C++ 数据结构(六)链表迭代器与底层
c语言·数据结构·c++·链表·stl库
汉克老师1 小时前
GESP7级C++考试语法知识(二、指数函数(3、综合练习)
c++·算法·数学建模·指数函数·gesp7级·复利
C++ 老炮儿的技术栈1 小时前
Ubuntu root账号自动登陆
linux·运维·服务器·c语言·c++·ubuntu·visual studio
林间码客2 小时前
04 ROC曲线与AUC:从零开始手动计算
大数据·人工智能·算法
Irissgwe2 小时前
map/set/multimap/multiset 的底层逻辑与实现
数据结构·c++·算法·二叉树·stl·c·红黑树
IronMurphy2 小时前
【算法五十八】23. 合并 K 个升序链表
数据结构·算法·链表
思茂信息2 小时前
CST软件基于液态金属开关的方向图可重构天线
服务器·算法·重构·cst·仿真软件·电磁仿真
月疯2 小时前
PPG研究中暑的算法记录
算法
春日见3 小时前
vscode的AI编程插件推荐:
大数据·ide·vscode·算法·机器学习·编辑器·ai编程