排序——快速排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序——快速排序相关的知识,希望对你有一定的参考价值。

思路

快速的基本思路是每次都选取一个基准,然后将大于该基准的元素放在右边,小的放在左边。然后利用分治法,对基准的左区间和右区间进行下一轮的快排,直到每个区间只剩一个元素,终止递归。

关键点

本算法的关键点就是在选取一个基准后,将所有元素分成两个子区间。利用挖坑填补的生活原理,我们以当前区间为例,一般选取最左端数字为基准,挖出来后。用两个游标low,high放置在区间两端。第一步,high往左移动,找到一个小于基准的元素,填在空缺处(也就是low)。这样high的位置就有一个空缺了,我们再将low向右移动,找到一个大于基准的元素,补在high所在的空缺处。这样依次进行,直至low和high指向同一个位置。此时必然还有一个空缺等待填补,我们就将一开始挖出来的key填补回去。这样,就完成本区间的快排工作。如下图所示:

技术分享

技术分享

代码

void quickSort(vector<int> &v, int left, int right)  //区间的左边界left和右边界right
{
    if(left<right)  //当区间长度为1时就不再继续往下递归了
    {
        int key=v[left];  //取最左边的值为key(基准),并把它挖出来
        int low=left;
        int high=right;
        while(low<high){
            while(low<high&&v[high]>key){ //high往左边移动,找到一个小于key的数字
                high--;
            }
            v[low]=v[high];  //将这个数字填在low处
            while(low<high&&v[low]<key){  //low往右边移动,找到一个大于key的数字
                low++;
            }
            v[high]=v[low];  //将这个数字填在high处
        }
        v[low]=key;  //将基准重新填回到留出来的空缺里

        //以此时key的位置基准,分成两个区间,递归调用
        quickSort(v,left,low-1);
        quickSort(v,low+1,right);
    }
}

 

以上是关于排序——快速排序的主要内容,如果未能解决你的问题,请参考以下文章

C语言快速排序代码

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段

交换排序(冒泡排序快速排序的算法思想及代码实现)

列举你所知道的排序方法,请写出快速排序的伪代码

[leetcode]排序算法(冒泡排序,选择排序,插入排序,快速排序,计数排序)