欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-02-13 20:50:52
...

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

快速排序是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);
    }
};
相关标签: 理论