lomuto前后指针
创建前后指针,从左往右找比基准值小的进行交换,使得小的都排在基准值的左边。
思路:
定义两个变量
prev
和cur
cur
指向位置的数据和key
值比较若
arr[cur] < arr[keyi]
,prev
往后走一步并和cur
交换若
arr[cur] > arr[keyi]
,cur
继续往后
arr[cur]
越界后,将key
里的值和arr[prev]
的值互换。
代码:
Sort.h
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
//打印
void PrintArr(int* arr, int n);
//快速排序
//lomuto前后指针法
void QuickSort(int* arr, int left, int right);
Sort.c
#include"Sort.h"
//打印
void PrintArr(int* arr, int n)
{
for (int i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
//交换
void Swap(int* x, int* y)
{
int tmp = *x;
*x = *y;
*y = tmp;
}
//快速排序找基准值
//lomuto前后指针法
int _QuickSort3(int* arr, int left, int right)
{
int prev = left, cur = left + 1;
int keyi = left;
while (cur <= right)//cur > right就说明越界了
{
if (arr[cur] < arr[keyi] && ++prev != cur)//若arr[cur] < arr[keyi],prev往后走一步并和cur交换
{
Swap(&arr[cur], &arr[prev]);
}
cur++;//若arr[cur] > arr[keyi],cur继续往后
}
Swap(&arr[keyi], &arr[prev]);//arr[cur]越界后,将key里的值和arr[prev]的值互换。
return prev;//返回基准值
}
//快速排序
void QuickSort(int* arr, int left, int right)
{
if (left >= right)
{
return;
}
//[left,right]--->找基准值keyi
int keyi = _QuickSort(arr, left, right);
//左子序列:[left,keyi-1]
QuickSort(arr, left, keyi - 1);
//右子序列:[keyi+1,right]
QuickSort(arr, keyi + 1, right);
}
test.c
#include"Sort.h"
int main()
{
int a[] = { 5, 3, 9, 6, 2, 4, 7, 1, 8 };
int n = sizeof(a) / sizeof(int);
printf("排序前:");
PrintArr(a, n);
QuickSort(a, 0, n - 1);
printf("排序后:");
PrintArr(a, n);
return 0;
}
快速排序特性总结:
- 时间复杂度:O(nlogn)
- 空间复杂度:O(logn)