没事干 回忆下快排
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);
以上是关于没事干 回忆下快排的主要内容,如果未能解决你的问题,请参考以下文章