咸鱼学长快速排序
咸鱼学长的快速排序忘记了再翻翻,代码简洁美丽,真的值得我学习好久。
如图
基于双指针法,左右指针与基准值进行比较,确保分区过程的高效性。。
Partation()
函数实现了快速排序的分区操作,将数组分为两部分:左边部分小于等于基准值,右边部分大于等于基准值。
分区点的返回值为后续递归排序提供了依据。
#include<stdio.h>
int Partation(int l, int r, int a[]) {
int mid = a[l]; // 选择数组的第一个元素作为基准值(pivot)
while (l < r) { // 当左指针 l 小于右指针 r 时,继续循环
// 从右向左扫描,找到第一个小于等于基准值的元素
while (a[r] > mid && l < r) r--; // 如果当前元素大于基准值,右指针左移
a[l] = a[r]; // 将找到的小于等于基准值的元素放到左指针的位置
// 从左向右扫描,找到第一个大于等于基准值的元素
while (a[l] < mid && l < r) l++; // 如果当前元素小于基准值,左指针右移
a[r] = a[l]; // 将找到的大于等于基准值的元素放到右指针的位置
}
a[l] = mid; // 将基准值放到最终的位置(此时 l == r)
return l; // 返回基准值的最终位置
}
void QuickSort(int l, int r, int a[]) {
// 如果左边界 l 大于右边界 r,说明当前子数组已经有序或为空,直接返回
if (l > r) return;
int mid = Partation(l, r, a);// 调用分区函数 Partation,获取基准值的最终位置 mid
QuickSort(l, mid - 1, a);// 递归排序左半部分:从 l 到 mid-1
QuickSort(mid + 1, r, a);// 递归排序右半部分:从 mid+1 到 r
}
int main() {
int n;
scanf("%d",&n);
int a[n];
for(int i=0;i<n;i++)scanf("%d",&a[i]);
QuickSort(0,n-1,a);
for(int i=0;i<n;i++)printf("%d ",a[i]);
}