快速排序算法

本人是编程新手,为了考研和后续的学习而已。

平台的文本编辑不会用,时间紧迫不想在花时间学习平台的编辑器。

所以直接复制粘贴过来,免费分享。

因为都是自己的理解,都是大白话,所以有一些地方表述不合适或不够准确的请大佬帮忙更正。

更加希望有前辈指教,学生定虚心学习。

#include <stdio.h>

// 两数交换函数
void swap(int &a, int &b){
    int t;
    t = a;
    a = b;
    b = t;
}
// 快排函数
// 参数:待排数组,待排数组的左端点,待排数组的右端点
void quick_sort(int arr[], int left, int right){
    // 要从左到右排序,判断左边的起始位置是否是“左边”
    if(left >= right){
        return;
    }
    // 声明参考值 x,以及左侧端点位置、右侧端点位置。
    // +1 是为了通过偏移量杜绝数组以0开始容易搞混。
    int x = arr[(left + right + 1)/2],i = left - 1, j = right + 1;
    while(i < j){
        /* 先使端点位置到达真正的数组两端的元素的位置。
         * (本算法按照快排-升序sort为例,呈现:left < x < right 的结果)
         * 对比当前元素值与参考值的大小,如果是小于,右移指针。(如果一直都是小于那说明该数组本身就是升序的)
         * 直到 arr[left] > x 后,则要看右侧的元素值与 x 的大小。
         * 右指针同左指针一样,直到 arr[right] < x 后。
         * 此时呈现出:arr[left] > x > arr[right]
         * 则将两个当前值交换,变成:arr[left] < x < arr[right]
         *
         * 注:操作的是指针的位置对比,理应是:i < x < j,当循环变成 i > j 时说明以全部遍历完成。
         * */
        do i++; while (arr[i] < x);
        do j--; while (arr[j] > x);
        if(i < j){
            swap(arr[i], arr[j]);
        }
    }
    // 递归
    quick_sort(arr, left, i - 1); //x的左半部分
    quick_sort(arr, i, right); //x的右半部分
}

int main(void) {
    int n;//共有多少个数据
    scanf("%d", &n);
    int arr[n]; // 数组存放数据
    for(int i = 0; i < n; i++){ // 循环输入数据本身
        scanf("%d", &arr[i]);
    }

    // 执行快排
    quick_sort(arr, 0, n-1);

    // 遍历
    for(int i = 0; i < n; i++){
        printf("%d ",arr[i]);
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值