【快速排序】

快速排序因排序效率高常被采用,在软件公司笔试面试及程序考试中常见。它由C.R.A.Hoare于1962年提出,采用分治策略。基本思想是先取基准数,分区使大于它的放右边、小于它的放左边,再对左右区间重复操作,直至各区间只有一个数。

 

快速排序

哔哩哔哩 https://www.bilibili.com/video/BV1Tt411r75A?from=search&seid=8963086176545103840

快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。

快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。

 

该方法的基本思想是:

  • 1.先从数列中取出一个数作为基准数。(通常为数列第一个值)
  • 2.分区过程,大于这个数大的全放到它的右边,小于它的数全放到它的左边。
  • (相等的不用排序交换,因为小和大的值都已经排好的话就自然剩下的相等数值在一排,如果交换相等的会导致算法错误)
  • 3.再对左右区间重复第二步,直到各区间只有一个数。  

    

用白话概况则 在一次排序的中,我们选取第一个点为数组中心点,

    1.这时我们需要找到数组中心点的索引值的同时

    2.并将所有值和中心值对比,将比中心值大的放在右边,小于它的数全放到它的左边。左右区域不需要排序

    3.除了中心点以外的左右区域回到第一步进行下一次排序

 

19    97   9  17 1  8

L                         R

递归实现:

/* 从小到大排序 递归 */
void quickSort(int *arr, int L, int R)
{
    /* 退出条件: 数组只有一个值时则被当做已经排序好的最新序列 */
    if (L >= R) {
        return;
    }
    int left = L;
    int right = R;
    /* 将数组最左侧值作为中心轴值,保存起来,下面将寻找中心轴的位置
        数组的最左侧的可以当做数组第一个需要填值的开始
        1.将比basic小的值,放在数组左侧
        2.将比basic大的值,放在数组右侧
    */
    int basic = arr[L]; 
    while (left < right) {
        /*  在右侧 找到比basic小的数 */
        while (left < right && basic <= arr[right]) {
            right--;
        }
        /* 将比basic小的值,放在数组左侧 ,注意,如果left == right 时,会跳到末尾(最后有left == right的判断) */
        if (left < right) {
            arr[left] = arr[right];
        }

        /*  在左侧 找到比basic大的数 */
        while (left < right && basic >= arr[left]) {
            left++;
        }
        /* 将比basic大的值,放在数组右侧 ,注意,如果left == right 时,会跳到末尾(最后有left == right的判断) */
        if (left < right) {
            arr[left] = arr[right];
        }
        /* 当left == right,说明 已到达中心轴位置,就是basic值坐标,此次排序结束 */
        if (left >= right) {
            arr[left] = basic;
        }
    }
    /* right坐标已经不需要再排序*/
    /* 数组的左边区域排序 */
    quickSort(arr,  L, right - 1);
    /* 数组的右边区域排序 */
    quickSort(arr, left + 1, R);
}

int main(int argc, const char *argv[])
{
    int a[8] = {1, 3, 6, 8, 8, 9, 7, 8};
    quickSort(a, 0, 7);
    for (int i = 0; i < 8; i++) {
        printf("%d ", a[i]);
    }
    printf("\n");
    return 0;
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值