面试高频题目:一种优雅对称的快排源码实现

排序算法是整个算法体系中的最核心的一大块,而快速排序又是排序算法中最核心的一种实现,相信大家都懂排序算法的原理:

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

该方法的基本思想是:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。

快速排序成为面试的高频题目,大多数人原理都懂,但要真正手写一个快速排序,并且一次性写对难度还是非常大。网上铺天盖地很多各种各样的实现,虽然都能实现功能,但大多都难懂,且写的过于冗长,不够简洁,关键是难记。是的,有时候面试前想临时抱佛脚,但无奈记住。

下面,我提供一种对称优雅的快排实现,最关键的是容易死记硬背,清晰明了。

class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
        QuickSort(nums,0,nums.size()-1);
        return nums;
    }
    
    void QuickSort(vector<int>& nums,int left,int right){
        //选择一个中间值
        int pivot = nums[left+(right-left)/2];
        int l = left;
        int r = right;
        while(l < r){
            while(nums[l] < nums[pivot])
                l++;
            while(nums[r] > nums[pivot])
                r--;
            
            if(l >= r){
                break;
            }
            
            int tmp = nums[l];
            nums[l] = nums[r];
            nums[r] = tmp;
        }
        
        if(l <= left)
            QuickSort(nums,l,left);
        if(r < right)
            QuickSort(nums,r,right);
    }
};
void qsort(vector<int> &nums, int left, int right) {
      if (left >= right) return;
      //选择一个中间值
      int pivot = nums[left + (right - left) / 2];
      int l = left;
      int r = right;
      while (l <= r) {
        while (nums[l] < pivot)
          l++;
        while (nums[r] > pivot)
          r--;

        if (l > r) {
          break;
        }

        int tmp = nums[l];
        nums[l] = nums[r];
        nums[r] = tmp;
        l++;
        r--;
      }
      printf("====%d,%d====\n",l,r);
      qsort(nums, left, r);
      qsort(nums, l, right);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值