zoukankan      html  css  js  c++  java
  • 002-排序算法-快速排序

    一、概述

      快速排序(Quick Sort)使用分治法策略。

      快速排序的基本思想:通过一趟排序以基准元素[一般选择序列的第一个元素]为界限将待排序列分割成两个独立的部分,然后再对两个独立的部分进行快排,依次类推直到序列整体有序。

    排序方法时间复杂度(平均)时间复杂度 (最坏)时间复杂度(最好)空间复杂度稳定性
    快速排序 O(nlogn) O(n^2) O(nlogn) O(logn) 不稳定

    稳定性

      快速排序算法的稳定性取决于和基准值交换的那个数的大小,如果它们相等的话,那么稳定性就被破坏了,所以快速排序是一种不稳定的排序方法。

    时间复杂度

      最坏的情况就是每次划分之后,一边只有一个元素,另一边有n-1个元素,这样就得划n-1次,这时候时间复杂度为O(n2);

      快速排序的快慢取决于区域划分的次数,理想情况下是每次都等分,所以划分次数为logn(即log2n),时间复杂度为T[n] = 2T[n/2] + O(n)其中O(n)为PARTITION()的时间复杂度,对比主定理,T[n]= aT[n/b]+f (n),我们的快速排序中:a = 2, b = 2, f(n) = O(n)

      如果,既时间复杂度:O(nlogn)

     1.1、算法说明

      排序:6 1 2 7 9 3 4 5 10 8

      过程:以第一个数6为基准值,从右侧开始,找到一个比6小的a[j],然后从左侧开始找一个比6大的a[j],进行交换,一直循环即可,直到 i 和 j 相遇a[i]=a[j];

        

           → 

          

        

      后续的话,分为两部分递归调用上述过程即可

    1.2、算法实现

        public static void quickSort2(int a[], int low, int high) {
            if (low < high) {
                int i = low, j = high, key = a[i];
                while (i < j) {
                    //先看右边,依次往左递减 找到比基准值 key 小的 退出循环,准备和下面的大于的换
                    while (i < j && key <= a[j]) {
                        j--;
                    }
                    //在看做边,依次往右递增 找到比基准值key 大的的 退出循环,准备和上面面的小于的换
                    while (i < j && a[i] <= key) {
                        i++;
                    }
                    //如果i<j,交换它们
                    if (i < j) {
                        int tmp = a[j];
                        a[j] = a[i];
                        a[i] = tmp;
                    }
                }
                //最后将基准为与i和j相等位置的数字交换
                a[low] = a[i];
                a[i] = key;//把基准值放到合适的位置
                //递归调用左半数组
                quickSort2(a, low, j - 1);
                //递归调用右半数组
                quickSort2(a, j + 1, high);
            }
        }

    代码地址:地址 中的rithm-001-sort中 QuickSort 

    参看地址:https://blog.csdn.net/shujuelin/article/details/82423852

    大树

  • 相关阅读:
    AndroidStudio gradle配置
    Git中pull对比fetch和merge
    Knockout.js随手记(7)
    Knockout.js随手记(6)
    MVC自动绑定整数数组
    Knockout.js随手记(5)
    ASP.NET4.5Web API及非同步程序开发系列(3)
    Knockout.js随手记(4)
    ASP.NET4.5Web API及非同步程序开发系列(2)
    ASP.NET4.5Web API及非同步程序开发系列(1)
  • 原文地址:https://www.cnblogs.com/bjlhx/p/10930448.html
Copyright © 2011-2022 走看看