码迷,mamicode.com
首页 > 编程语言 > 详细

排序——快速排序

时间:2017-10-24 14:13:20      阅读:227      评论:0      收藏:0      [点我收藏+]

标签:原理   成本   color   log   cto   移动   递归调用   vector   UI   

思路

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

关键点

本算法的关键点就是在选取一个基准后,将所有元素分成两个子区间。利用挖坑填补的生活原理,我们以当前区间为例,一般选取最左端数字为基准,挖出来后。用两个游标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);
    }
}

 

排序——快速排序

标签:原理   成本   color   log   cto   移动   递归调用   vector   UI   

原文地址:http://www.cnblogs.com/wust-owen/p/7722937.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!