快速排序前后指针法(代码注释)

 前后指针法

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
// 交换两个元素的位置
void Swap(int* p1, int* p2) {
    int tmp = *p1;
    *p1 = *p2;
    *p2 = tmp;
}
// 打印数组
void PrintArray(int* a, int n) {
    for (int i = 0; i < n; i++) {
        printf("%d ", a[i]);
    }
    printf("\n");
}
// 快速排序函数
void QuickSort(int* a, int left, int right) {
    // 如果区间无效或只剩一个元素,直接返回
    if (left >= right) {
        return;
    }
    // 设置初始基准值的位置(选取左边的元素作为基准值)
    int prev = left;  // prev 用于标记小于基准值的区域的末尾位置
    int cur = prev + 1;  // cur 用于遍历数组
    int pivotIndex = left;  // 基准值的位置(初始化为左边界)
    // 遍历整个区间,进行分区
    while (cur <= right) {
        // 如果当前元素小于基准值并且 prev 位置还没有与 cur 交换
        if (a[cur] < a[pivotIndex] && ++prev != cur) {
            // 如果符合条件,则交换 a[prev] 和 a[cur]
            Swap(&a[prev], &a[cur]);
        }
        ++cur;  // 继续向右移动 cur 指针
    }
    // 最后将基准值与 prev 位置的元素交换,将基准值放到正确的位置
    Swap(&a[prev], &a[pivotIndex]);
    pivotIndex = prev;  // 更新基准值位置
    // 递归处理左右两个子区间
    QuickSort(a, left, pivotIndex - 1);  // 处理左区间
    QuickSort(a, pivotIndex + 1, right);  // 处理右区间
}
int main() {
    // 初始化一个数组
    int a[] = { 7, 5, 6, 4, 8, 9, 2, 1, 3, 0 };
    int n = sizeof(a) / sizeof(a[0]);  // 数组的元素个数
    // 输出排序前的数组
    printf("Before sorting:\n");
    PrintArray(a, n);
    // 调用快速排序
    QuickSort(a, 0, n - 1);
    // 输出排序后的数组
    printf("After sorting:\n");
    PrintArray(a, n);
    return 0;
}

测试结果

详细可见排序学习整理(2)-优快云博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值