快速排序法的几种版本

本文介绍了快速排序的三种版本:Hoare版本、挖坑法(Lomoto分区)和前后指针法。通过详细解释和代码展示,阐述了快速排序的分治法思想以及如何通过枢轴元素将数组划分为有序部分。最后还提到了非递归实现快速排序的可能性。
摘要由CSDN通过智能技术生成

快速排序法:

Hoare版本—快速排序的主框架:部分排序函数 + 快速排序递归主体

取待排序数组的某个元素作为枢轴元素,并在左右创建两个指针

分别指向数组左右端,不断向中间移动

如果两指针同时满足:

  • 左指针指向的数值大于key(枢轴元素)
  • 右指针指向的数值小于key

交换两个元素,否则指针不断移动

最终:待处理数组区间中,枢轴元素的左边全部都是小于枢轴元素的值

右边则都是大于它的值

HoarePartition函数最终返回一个枢轴元素的索引

在QuickSortHoare函数中

首先创建一个枢轴元素pivotIndex

并将待处理数组的左右索引以及数组地址带入HoarePartition函数

进行第一次排序

此后,数组被枢轴元素pivotIndex分成了两部分

左、右的部分分别再用递归进行排序

最终使得整个数组有序

Hoare的快速排序符合分治法的思想Divide and Conquer

将一个数组不断分成更小的数组,递归处理每一部分

部分有序最终使得整个数组有序

代码部分:

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>



int HoarePartition(int* arr, int left, int right)

{

int pivotIndex = arr[left];

int i = left;

int j = right;

 

 

while (i < j)

{

//不断移动两边的指针

while (arr[i] < pivotIndex)

{

i++;

}

 

while (arr[j] > pivotIndex)

{

j--;

}

 

//直到两个指针相遇(函数的跳出条件)

if (i >= j)

{

return j;

}

 

//如果没有进入上面的循环说明

//两个循环的条件都不满足

//也就满足了交换的条件

Swap(&arr[i], &arr[j]);

}

}

 

int QuickSortHoare(int* arr, int left, int right)

{

if (left < right)

{

int pivotIndex = HoarePartition(arr, left, right);

QuickSortHoare(arr, left, pivotIndex - 1);

QuickSortHoare(arr, pivotIndex + 1, right);

}

}

 

 

void PrintArray(int* arr, int size)

{

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

{

printf("%d ", arr[i]);

}

printf("\n");

}

 

int main()

{

 

int arr[]= { 64, 11, 29,
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值