快速排序法:
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,