聊聊时间复杂度为O(nlogn)的快速排序(上)

快速排序

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

快速排序原理图

在这里插入图片描述
了解了原理,让我们直接上代码吧

//快速排序
        template<typename T>
        void quickSort(T arr[], int n)
        {
            __quickSort(arr, 0, n - 1);
        }
        //对arr[l, r] 部分进行快速排序
        template<typename T>
        void __quickSort(T arr, int l, int r)
        {
            if(l >= r) return;
            int p = __partition(arr, l, r);
            __quickSort(arr, l, p-1);
            __quickSort(arr, p+1, r);
        }
        // 对arr[l, r]部分进行partition操作
        // 返回p,使得arr[l, p - 1] < arr[p] ; arr[p+1, r] > arr[p]
         template<typename T>
         int __partition(T arr[], int l, int r)
         {
             T v = arr[l];
            // arr[l+1, j] < v    arr[j+1, i) > v
             int j = l;     //设置 j 的初始值为l,就是保证刚开始小于v的子数组为空
             for(int i = l + 1; i <= r; i++)  // 设置 i 的初始值为l + 1,就是保证刚开始大于v的子数组为空
             {
                 if(arr[i] < v)
                 {
                     swap(arr[j + 1], arr[i]);
                     j++;
                 }
             }
             swap(arr[l], arr[j]);
             return j;
         }

下一篇,将对快速排序进行优化~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值