zoukankan      html  css  js  c++  java
  • 没事干 回忆下快排

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

    快排思路 : 每进一层都会梳理元素顺序 比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);
            }
        }
  • 相关阅读:
    prometheus 基于文件的目标发现
    prometheus rules
    consul kv使用介绍
    prometheus 标签使用
    prometheus 配置容器 cadvisor监控节点
    prometheus 配置介绍
    Ubuntu 13.10 录音有特别大噪音解决办法
    Ubuntu 13.10 解决虚拟机摄像头无法使用问题
    Ubuntu 13.10 安装软件失败后出现的问题——已安装 post-installation 脚本 返回了错误号 1
    Ubuntu 13.04 VirtualBox在工作区中的切换
  • 原文地址:https://www.cnblogs.com/chenggg/p/11048672.html
Copyright © 2011-2022 走看看