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) // 由于递归调用栈

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

相关推荐
GoAI6 小时前
DeepSeek Harness Memory (一)主流记忆插件总结
后端·算法·面试
Pniubi6 小时前
力扣54.螺旋矩阵
算法·leetcode·矩阵
Zwawa7 小时前
用两个按键做一个OLED菜单:先把选择和执行分开
c语言·单片机·嵌入式
choumou_M9 小时前
算法_1:由浅入深学习快速排序QuickSort
学习·算法·排序算法
Coder_Shenshen9 小时前
罗克韦尔ACD工程归档离线变量树解析
算法·c#
心仪久了会沦陷11 小时前
C语言数据结构入门——树与二叉树详解:概念、堆实现与链式遍历
c语言·数据结构·算法
小此方11 小时前
[算法实战论:动态规划]背包问题概念,01不满背包问题,01满背包问题,背包问题的滚动数组空间优化
算法·动态规划
悠仁さん12 小时前
【C++】哈希表
c++·算法·散列表
地平线开发者13 小时前
点云算法整理与常用计算模块:从数据到模型,再到工程与量化
算法·自动驾驶