码迷,mamicode.com
首页 > 其他好文 > 详细

没事干 回忆下快排

时间:2019-06-19 00:30:08      阅读:108      评论:0      收藏:0      [点我收藏+]

标签:sort   break   二叉树   递归   左右   合规   执行   结束   快排   

递归都是把问题细化后找到解决问题的通用路径然后决定结束条件

快排思路 : 每进一层都会梳理元素顺序 比key值大的放右边 比key值小的放左边 每次这样执行下去 最终我们就得到了一个有序的数组

来看一下这一步骤应对的操作:

  while (true)
            {
                #region 单一次换值  在外层套个while处理多个这种情况的出现
          key = (left + right)/2; //找到左边比key值大的 while (arr[++left] > key) ; //找到右边比key小的 while (arr[--right] < key) ; //左边索引比右边大那就说明这牌数据 左右两边值都合规矩 if (left >= right) break; arr[left] = arr[right] + arr[left] - (arr[right] = arr[left]); #endregion 处理结束 }

这样确保了key的左侧比key小右侧比key大 然后现在的情况就是 得到两个宏观上有序的数组 分别是 0-key值所在索引的左侧(即 left-1) 和 key值所在索引的右侧(即right+1)

然后 我们分别对这两个数组继续这种操作    

//分别对左右侧数据进行梳理 
sortMethd(arr, left, i - 1);
sortMethd(arr, j + 1, right);

这样 只要进行到right<=left的时候即可说明此时数组是完全有序的 

像不像二叉树遍历哈哈  这就是分治算法的小例子

下面贴下完整代码:

 void QuickSort(int[] arr, int left, int right)
    {
        if (left < right)
        {
            int key = arr[(left + right) / 2];
            int i = left - 1;
            int j = right + 1;
            while (true)
            {
                while (arr[++i] < key) ;
                while (arr[--j] > key) ;
                if (i >= j)
                    break;
                arr[i] = arr[j] + arr[i] - (arr[j] = arr[i]);
            }
            QuickSort(arr, left, i - 1);
            QuickSort(arr, j + 1, right);
        }
    }

 

没事干 回忆下快排

标签:sort   break   二叉树   递归   左右   合规   执行   结束   快排   

原文地址:https://www.cnblogs.com/chenggg/p/11048672.html

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