快速排序

三世轮回 提交于 2020-01-25 19:20:58

基本思想:给定一个数组a,以a[low]为基准,赋值给X保存,X = a[low](相当于把a[low]的位置腾空了,挖出一个坑),从数组的两边开始查找比较

1.(先从high开始,找到第一个小于基准的元素,然后和a[low]交换位置,即填入a[low]腾出的坑中);

2.再从数组的low位置开始比较,找到第一个大于a[low]的数,填入最新的腾出的坑中(也就是上一步中,满足条件的a[high]的位置)

完成第1步和第2步后,就基准元素就找到了它最终所在的位置;对基准元素左右两边的区间分别再执行上面的两个步骤,最后所得的数组,就是有序的数组。

//快速排序
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);
    }
}
 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!