zoukankan      html  css  js  c++  java
  • 算法和数据结构 快速排序

    1、时间复杂度:O(NlogN)。

    2、算法思想:分治。

    3、算法实现

    1)从数组中取一个数作为基准数pivot,基准数所在的位置hole;

    2)把不大于pivot的数放到左边,大于的放到右边,这样就形成左右两个子数组;

    2.1)从右向左找一个不大于pivot的数,放到位置hole上,更新hole为找到的数的位置。 

    2.2)从左向右找一个大于pivot的数,放到位置hole上,更新hole为找到的数的位置。

    2.3)不断重复步骤2.1)和2.2),直到找不到。 

    3)对左右子数组,分别重复步骤1)和2),直到各个子数组都不多于一个元素。

    void quick_sort(std::vector<int> &arr, int l, int r)
    {
        // 子数组不多于1个元素,即有序
        if (l >= r) return;
        // 取子数组第一个数为基准数,产生一个坑
        int pivot = arr[l], hole = l;
        int i = l, j = r;
        while (i < j) {
            // 从右向左找一个不大于基准数的数,条件i < j用于防止越界
            while (i < j && arr[j] > pivot) j--;
            // 把找到的数放到坑里,并更新坑
            arr[hole] = arr[j];
            hole = j;
            // 从左向右找一个大于基准数的数
            while (i < j && arr[i] <= pivot) i++;
            arr[hole] = arr[i];
            hole = i;
        }
        arr[hole] = pivot;
        quick_sort(arr, l, hole-1);
        quick_sort(arr, hole+1, r);
    }

    4、快速排序不稳定,因为相等的数,排序前后的相对位置可能会变,具体看实现中的判断条件。

  • 相关阅读:
    搭建集群时遇到各种奇葩问题的大招~~
    oracle初学心得(转)
    "小寒"饮食养生
    时刻修正自已的思想
    myeclipse使用
    从javascript语言本身谈项目实战(转)
    Java的内存泄漏(转)
    概念解释
    小穴位大健康——李智
    历史朝代表
  • 原文地址:https://www.cnblogs.com/yangwenhuan/p/12519678.html
Copyright © 2011-2022 走看看