您的位置:首页 > 其它

排序算法:快速排序(挖坑填数+分治)

2018-03-03 21:34 246 查看
复习一下 浓缩一下 http://blog.csdn.net/morewindows/article/details/6684558这篇文章是必看的
例:72 6 57 88 60 42 83 73 48 85
只需要挖72,然后从85开始向前找一个比72小的,放到72,挖出新坑,从6开始找比大的,找到再挖出新坑,循环即可,直到左右标记位相遇。这样就是完成一次。
然后再对72左边和右边的区间递归,递归终止的条件是要递归的区间中只有一个数。

//快速排序  
void quick_sort(int s[], int l, int r)  
{  
    if (l < r)  
    {  
        //Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换 参见注1  
        int i = l, j = r, x = s[l];  
        while (i < j)  
        {  
            while(i < j && s[j] >= x) // 从右向左找第一个小于x的数  
                j--;    
            if(i < j)   
                s[i++] = s[j];  
              
            while(i < j && s[i] < x) // 从左向右找第一个大于等于x的数  
                i++;    
            if(i < j)   
                s[j--] = s[i];  
        }  
        s[i] = x;  
        quick_sort(s, l, i - 1); // 递归调用   
        quick_sort(s, i + 1, r);  
    }  
}  
点评代码:1.如何实现先从右找,找到了再换左找呢?他是放置了一右一左两个while。
2.最后坐标相遇,把初始挖的值放到最后坑位中
3.最后进行左右递归

快速排序搞定!开开心心去面试了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: