【C语言】快速排序

快速排序算法

qsort函数底层思想为快速排序(quick sort)

1.快速排序的思想:
  • 从数列中挑出一个元素,称为 “基准”,“枢轴”(pivot);

  • 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;

  • 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

在这里插入图片描述

1.实现代码(有详细注释)
//每次交换均为枢轴与待交换值得交换,最终枢轴处于它应在得位置
void Swap(int* base, int low, int high)
{
    int tmp = base[low];
    base[low] = base[high];
    base[high] = tmp;
}
//第一次进入时,首元素为枢轴,比其小的放左边,比其大的放右边,得到首个元素应处的位置
int get_point(int* base, int low, int high)
{
    int pivot = base[low];
    while (low < high)
    {
        while (low < high && base[high] > pivot)//跳过本就大于枢轴,不需调动的元素
        {
            high--;
        }
        Swap(base, low, high);//将小于枢轴的的元素调至左侧

        //注意:每次交换的中间数均为定义的枢轴

        while (low < high && base[low] < pivot)//跳过本就小于枢轴,不需调动的元素
        {
            low++;
        }
        Swap(base, low, high);//将大于枢轴的的元素调至右侧
    }
    return low;
}

//快排函数
void quick_sort(int* base, int low, int high)
{
    if (low < high)
    {
        //找到每次快排范围内枢轴应处的位置,根据其位置将排查域进行分割
        //对每块子区域进行相同操作,以此递归
        
        //得到初始low位置元素应处的位置
        int point = get_point(base, low, high);
        // 对point之前元素进行快速排序
        quick_sort(base, low, point - 1);
        //对point之后元素进行快速排序
        quick_sort(base, point + 1, high);
    }
}

int main()
{
    int i;
    int arr[] = { 5,13,6,24,2,8,19,27,6,12,1,17 };
    int sz = sizeof(arr) / sizeof(arr[0]);

    quicksort(arr, 0, sz-1);

    for (i = 0; i < sz; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值