0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

快速排序是一種交換排序

算法與數(shù)據(jù)結(jié)構(gòu) ? 來源:未知 ? 作者:李倩 ? 2018-07-27 14:49 ? 次閱讀

要點

快速排序是一種交換排序。

快速排序由C. A. R. Hoare在1962年提出。

它的基本思想是:通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨立的兩部分:分割點左邊都是比它小的數(shù),右邊都是比它大的數(shù)。

然后再按此方法對這兩部分數(shù)據(jù)分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數(shù)據(jù)變成有序序列。

詳細的圖解往往比大堆的文字更有說明力,所以直接上圖:

上圖中,演示了快速排序的處理過程:

初始狀態(tài)為一組無序的數(shù)組:2、4、5、1、3。

經(jīng)過以上操作步驟后,完成了第一次的排序,得到新的數(shù)組:1、2、5、4、3。

新的數(shù)組中,以2為分割點,左邊都是比2小的數(shù),右邊都是比2大的數(shù)。

因為2已經(jīng)在數(shù)組中找到了合適的位置,所以不用再動。

2左邊的數(shù)組只有一個元素1,所以顯然不用再排序,位置也被確定。(注:這種情況時,left指針和right指針顯然是重合的。因此在代碼中,我們可以通過設置判定條件left必須小于right,如果不滿足,則不用排序了)。

而對于2右邊的數(shù)組5、4、3,設置left指向5,right指向3,開始繼續(xù)重復圖中的一、二、三、四步驟,對新的數(shù)組進行排序。

核心代碼

publicintdivision(int[]list,intleft,intright){//以最左邊的數(shù)(left)為基準intbase=list[left];while(left=base)right--;//找到了比base小的元素,將這個元素放到最左邊的位置list[left]=list[right];//從序列左端開始,向右遍歷,直到找到大于base的數(shù)while(left

快速排序算法的性能

時間復雜度

當數(shù)據(jù)有序時,以第一個關(guān)鍵字為基準分為兩個子序列,前一個子序列為空,此時執(zhí)行效率最差。

而當數(shù)據(jù)隨機分布時,以第一個關(guān)鍵字為基準分為兩個子序列,兩個子序列的元素個數(shù)接近相等,此時執(zhí)行效率最好。

所以,數(shù)據(jù)越隨機分布時,快速排序性能越好;數(shù)據(jù)越接近有序,快速排序性能越差。

空間復雜度

快速排序在每次分割的過程中,需要 1 個空間存儲基準值。而快速排序的大概需要 Nlog2N次的分割處理,所以占用空間也是 Nlog2N 個。

算法穩(wěn)定性

在快速排序中,相等元素可能會因為分區(qū)而交換順序,所以它是不穩(wěn)定的算法。

完整參考代碼

JAVA版本

代碼實現(xiàn)

1publicclassQuickSort{23publicintdivision(int[]list,intleft,intright){4//以最左邊的數(shù)(left)為基準5intbase=list[left];6while(left=base)9right--;10//找到了比base小的元素,將這個元素放到最左邊的位置11list[left]=list[right];1213//從序列左端開始,向右遍歷,直到找到大于base的數(shù)14while(left

運行結(jié)果

排序前: 1 3 4 5 2 6 9 7 8 0 base = 1: 0 1 4 5 2 6 9 7 8 3 base = 4: 3 2 4 6 9 7 8 5 base = 3: 2 3 base = 6: 5 6 7 8 9 base = 7: 7 8 9 base = 8: 8 9 排序后: 0 1 2 3 4 5 6 7 8 9

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4588

    瀏覽量

    92506
  • 快速排序
    +關(guān)注

    關(guān)注

    0

    文章

    3

    瀏覽量

    5426

原文標題:排序算法總結(jié)(2):快速排序

文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    FPGA排序-冒泡排序介紹

    排序算法是圖像處理中經(jīng)常使用一種算法,常見的排序算法有插入排序、希爾排序、選擇排序、冒泡
    發(fā)表于 07-17 10:12 ?1051次閱讀
    FPGA<b class='flag-5'>排序</b>-冒泡<b class='flag-5'>排序</b>介紹

    快速排序

    // 快速排序package algorithmsimport "fmt"http:// 第一種寫法func quickSort(values []int, left, right int
    發(fā)表于 10-17 19:05

    簡述計算機排序

    不用交換,低指針指向的小于樞軸的元素不用交換。直到高低指針指向小于等于或者大于等于的元素后直接交換元素。趟過后,在低子分區(qū)和高子分區(qū)中繼續(xù)進行遞歸
    發(fā)表于 12-26 23:07

    嵌入式stm32實用的排序算法 - 交換排序

    :插入排序、選擇排序、交換排序、歸并排序、基數(shù)排序。排序的分類大致為如下圖:在內(nèi)部
    發(fā)表于 04-12 13:14

    C#實現(xiàn)快速排序

    快速排序法是對冒泡排序一種改進。它的基本思想是,通過排序將待
    發(fā)表于 08-09 17:57 ?16次下載

    文了解冒泡排序

    冒泡排序一種交換排序。 什么是交換排序呢? 交換排序:兩兩比較待排序的關(guān)鍵字,并
    的頭像 發(fā)表于 01-17 12:47 ?3006次閱讀
    <b class='flag-5'>一</b>文了解冒泡<b class='flag-5'>排序</b>

    常用排序算法分析

    一種是比較排序,時間復雜度O(nlogn) ~ O(n^2),主要有:冒泡排序,選擇排序,插入排序,歸并
    的頭像 發(fā)表于 07-13 16:13 ?2127次閱讀

    實用的排序算法 - 交換排序

    實用的排序算法 - 交換排序
    的頭像 發(fā)表于 03-20 09:53 ?1711次閱讀
    實用的<b class='flag-5'>排序</b>算法 -  <b class='flag-5'>交換排序</b>

    排序算法分享:歸并排序說明

    我們今天繼續(xù)給大家分享排序算法里面的另外一種排序算法:歸并排序
    的頭像 發(fā)表于 12-24 14:34 ?747次閱讀

    揭秘冒泡排序交換排序和插入排序

    個教官對這支隊伍進行整理,使得隊伍里的人從低到高的排下去,教官想到了一種排序算法來對這支隊伍進行身高排序。 如何理解冒泡排序 教官立馬想到了
    的頭像 發(fā)表于 06-18 09:57 ?1518次閱讀

    C語言排序快速排序的技巧

    快速排序是由東尼·霍爾所發(fā)展的一種排序算法。在平均狀況下,排序 n 個項目要Ο(n log n)次比較。在最壞狀況下則需要Ο(n2)次比較,
    的頭像 發(fā)表于 07-29 15:14 ?2437次閱讀
    C語言<b class='flag-5'>排序</b>中<b class='flag-5'>快速</b><b class='flag-5'>排序</b>的技巧

    希爾排序的基本思想

    希爾排序是插入排序一種,又稱“縮小增量排序”,希爾排序是直接插入排序算法的
    發(fā)表于 08-08 10:02 ?1340次閱讀

    冒泡排序的基本思想

    冒泡排序的英文Bubble Sort,是一種最基礎的交換排序。之所以叫做冒泡排序,因為每個元素都可以像小氣泡
    的頭像 發(fā)表于 01-20 11:38 ?5744次閱讀
    冒泡<b class='flag-5'>排序</b>的基本思想

    php版冒泡排序是如何實現(xiàn)的?

    無論學習哪一種編程語言,進行算法方面的訓練時都繞不開“排序”。排序在進階編程中有非常廣泛的應用,要想成為編程高手,排序算法是必須要掌握的。而冒泡排序
    的頭像 發(fā)表于 01-20 10:39 ?881次閱讀
    php版冒泡<b class='flag-5'>排序</b>是如何實現(xiàn)的?

    jwt冒泡排序的原理

    jwt簡介 冒泡排序: (Bubble Sort)是一種簡單的交換排序。之所以叫做冒泡排序,因為我們可以把每個元素當成個小氣泡,根據(jù)氣泡大
    的頭像 發(fā)表于 09-25 16:33 ?505次閱讀
    jwt冒泡<b class='flag-5'>排序</b>的原理