日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

排序算法系列:快速排序算法

發布時間:2025/3/20 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 排序算法系列:快速排序算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

概述

在前面說到了兩個關于交換排序的算法:冒泡排序與奇偶排序。
 本文就來說說交換排序的最后一拍:快速排序算法。之所以說它是快速的原因,不是因為它比其他的排序算法都要快。而是從實踐中證明了快速排序在平均性能上的確是比其他算法要快一些,不然快速一說豈不是在亂說?
 本文就其原理、過程及實現幾個方面講解一下快速排序算法。


版權聲明

著作權歸作者所有。
商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
作者:Q-WHai
發表日期:2016年3月1日
鏈接:https://qwhai.blog.csdn.net/article/details/50622744
來源:CSDN
更多內容:分類 >> 算法與數學


目錄

文章目錄

  • 概述
  • 版權聲明
  • 目錄
  • 快速排序
    • 算法原理
      • 原理分析
      • 原理圖
    • 算法步驟
      • 步驟
      • 過程演示圖
    • 邏輯實現
    • 復雜度分析
    • 番外
  • Ref
  • GitHub源碼下載

快速排序

算法原理

原理分析

快速排序(Quicksort)是對冒泡排序的一種改進。

快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然后再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。

原理圖


算法步驟

步驟

  • 獲得待排序數組a
  • 選取一個合適的數字p(一般來說就選取數組或是子數組的第一個元素)作為排序基準
  • 將待排序數組a中比基準p小的放在p的左邊,比基準p大的放在p的右邊
  • 從第3步獲得的兩個子數組sub1跟sub2
  • 判斷sub1或sub2中是否只有一個元素,如果只有一個元素則返回此元素,否則就將sub1(或是sub2)代回到第1步中繼續執行
  • 具體過程可以參見下面的過程圖
  • 過程演示圖


    邏輯實現

    /** 排序的核心算法* * @param array* 待排序數組* @param startIndex* 開始位置* @param endIndex* 結束位置*/private void sortCore(int[] array, int startIndex, int endIndex) {if (startIndex >= endIndex) {return;}int boundary = boundary(array, startIndex, endIndex);sortCore(array, startIndex, boundary - 1);sortCore(array, boundary + 1, endIndex);}/** 交換并返回分界點* * @param array* 待排序數組* @param startIndex* 開始位置* @param endIndex* 結束位置* @return* 分界點*/private int boundary(int[] array, int startIndex, int endIndex) {int standard = array[startIndex]; // 定義標準int leftIndex = startIndex; // 左指針int rightIndex = endIndex; // 右指針while(leftIndex < rightIndex) {while(leftIndex < rightIndex && array[rightIndex] >= standard) {rightIndex--;}array[leftIndex] = array[rightIndex];while(leftIndex < rightIndex && array[leftIndex] <= standard) {leftIndex++;}array[rightIndex] = array[leftIndex];}array[leftIndex] = standard;return leftIndex;}

    復雜度分析

    排序方法時間復雜度空間復雜度穩定性復雜性
    平均情況最壞情況最好情況
    快速排序O(nlog2n)O(n2)O(nlog2n)O(log2n)不穩定較復雜

     這里我們可以做一些關于復雜度的推理。  如果我們在選取基準p的時候,每次選取的都是當前數組中最小的一個元素,那么每次劃分都只是讓數組中的元素少1(被篩選出來的那個元素當然有序),這樣一來就需要反復遍歷數組導致復雜度變成了O(n 2)。  如果我們在選取基準p的時候,每次選取的都是當前數組中最中間的一個元素(是中位數,而不是元素位置上的中間),那么每次劃分都把當前數組劃分成了長度相等的兩個子數組,這樣一來復雜度變成了O(nlog 2n)。

    番外

  • 對于基準元素的選取,也可以采用隨機數選取的方式
  • 如果要按照元素在位置上的中間來選取基準元素,還可以將中間位置上的元素與第一個元素進行對換

  • Ref

    • 《算法導論 (第3版)》
    • 《編程珠璣 (第2版)》

    GitHub源碼下載

    • https://github.com/qwhai/algorithms-sort

    總結

    以上是生活随笔為你收集整理的排序算法系列:快速排序算法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。