没事干 回忆下快排

Posted chenggg

tags:

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

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

快排思路 : 每进一层都会梳理元素顺序 比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);
        
    

 

以上是关于没事干 回忆下快排的主要内容,如果未能解决你的问题,请参考以下文章

排序之快排

快速入手八大排序,带你从入门到精通

快速排序实现(快排)

Quicksort

算法--排序--分治与快速排序

java实现快速排序