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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

常见排序算法的时间复杂度汇总

發(fā)布時間:2023/12/10 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 常见排序算法的时间复杂度汇总 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

非線性排序

通過比較來決定元素間的相對次序,由于其時間復(fù)雜度不能突破O(nlogn),因此稱為非線性時間比較類排序。

排序算法最佳時間復(fù)雜度平均時間復(fù)雜度最壞時間復(fù)雜度穩(wěn)定性空間復(fù)雜度
選擇排序O(N^2)O(N^2)O(N^2)不穩(wěn)定O(1)
插入排序O(N)O(N^2)O(N^2)穩(wěn)定O(1)
冒泡排序O(N)O(N^2)O(N^2)穩(wěn)定O(1)
希爾排序O(N)O(N^(3/2))O(N^S)(1<S<2)不穩(wěn)定O(1)
快速排序O(NlogN)O(NlogN)O(N^2)不穩(wěn)定O(logN)
堆排序O(NlogN)O(NlogN)O(NlogN)不穩(wěn)定O(1)
歸并排序O(NlogN)O(NlogN)O(NlogN)穩(wěn)定O(N)

注:logN表示以2為底N的對數(shù)。
穩(wěn)定性:待排序數(shù)據(jù)中有相同的數(shù),排序之后相同的數(shù)與排序前的前后位置關(guān)系不變,則成為穩(wěn)定排序算法。比如我們有一組數(shù)據(jù)2,9,3,4,8,3;按照大小排序之后就是2,3,3,4,8,9;兩個3的前后順序在排序前后保持不變,即穩(wěn)定。
為什么要考察穩(wěn)定性?
答:實際的開發(fā)任務(wù)中,并不是單純的對數(shù)字進行排序,而是對象,需要根據(jù)對象的某個key進行排序。舉個例子:現(xiàn)在要給電商交易系統(tǒng)中的“訂單”排序。訂單有兩個屬性,一個是下單時間,另一個是訂單金額。如果我們現(xiàn)在有10萬條訂單數(shù)據(jù),我們希望按照金額從小到大對訂單數(shù)據(jù)排序。對于金額相同的訂單,我們希望按照下單時間從早到晚有序。
最先想到的方法是:我們先按照金額對訂單數(shù)據(jù)進行排序,然后,再遍歷排序之后的訂單數(shù)據(jù),對于每個金額相同的小區(qū)間再按照下單時間排序。這種排序思路理解起來不難,但是實現(xiàn)起來會很復(fù)雜。
借助穩(wěn)定排序算法,這個問題可以非常簡潔地解決。解決思路是這樣的:我們先按照下單時間給訂單排序,注意是按照下單時間,不是金額。排序完成之后,我們用穩(wěn)定排序算法,按照訂單金額重新排序。兩遍排序之后,我們得到的訂單數(shù)據(jù)就是按照金額從小到大排序,金額相同的訂單按照下單時間從早到晚排序的。為什么呢?
穩(wěn)定排序算法可以保持金額相同的兩個對象,在排序之后的前后順序不變。第一次排序之后,所有的訂單按照下單時間從早到晚有序了。在第二次排序中,我們用的是穩(wěn)定的排序算法,所以經(jīng)過第二次排序之后,相同金額的訂單仍然保持下單時間從早到晚有序。

1 選擇排序

2 插入排序

3 冒泡排序

4 希爾排序

5 快速排序

以下為第一趟排序,基值為30,讓小于30的所有數(shù)據(jù)在30左邊,大于30的數(shù)據(jù)在30的右邊,然后遞歸分別對30左邊和右邊的數(shù)組進行相同的操作。

6 堆排序

通常用于求top K問題
這個用圖看不清楚,看這個鏈接吧

7 歸并排序

要理解和學(xué)會歸并的思想

線性排序

不通過比較來決定元素間的相對次序,它可以突破基于比較排序的時間下界,以線性時間運行,時間復(fù)雜度都可以趨近于O(N),因此稱為線性時間非比較類排序。 只適用于一些特定的場合。

8 桶排序

核心思想是:將將要排序的數(shù)據(jù)分到幾個有序的桶里,每個桶里的數(shù)據(jù)再單獨進行排序。桶內(nèi)排完序之后,再把每個桶里的數(shù)據(jù)按照順序依次取出,組成的序列就是有序的了。舉個簡單的例子:

每個桶內(nèi)進行快速排序后,根據(jù)桶的編號匯總數(shù)據(jù)即可。
使用要求:

  • 需要能很方便的將數(shù)據(jù)劃分成m個桶
  • 桶之間無需排序
  • 數(shù)據(jù)要盡量分布均勻

使用場景適合于外部排序。所謂外部排序就是數(shù)據(jù)存儲在外部磁盤中,數(shù)據(jù)量比較大,內(nèi)存有限,無法將數(shù)據(jù)全部加載到內(nèi)存中。MySQL在排序的時候如果內(nèi)存不夠,就會使用外部排序,把數(shù)據(jù)分成多份,每份單獨排序后寫入臨時文件,最后把這些有序的文件合成一個大文件。其通常采用的是歸并排序算法。
比如說我們有10GB的訂單數(shù)據(jù),我們希望按訂單金額(假設(shè)金額都是正整數(shù))進行排序,但是我們的內(nèi)存有限,只有幾百MB,沒辦法一次性把10GB的數(shù)據(jù)都加載到內(nèi)存中。這種情況就可以使用桶排序:

  • 先掃描文件找出金額的最小值和最大值。假設(shè)這里為1元和10萬元。
  • 可以分100個桶,第1個桶放1-1000元的數(shù)據(jù);第2個桶放1001-2000元的數(shù)據(jù);…以此類推。每個桶是一個文件,并給文件按順序編號。
  • 如果數(shù)據(jù)分布均勻,那每個文件大約100M,可以依次加載到內(nèi)存使用快排。如果數(shù)據(jù)分步不均勻,那可能需要對數(shù)據(jù)量大的桶繼續(xù)進行桶排序,直到內(nèi)存能裝下。
  • 9 計數(shù)排序

    可以認為是桶排序的特殊情況:要排序的數(shù)據(jù)的范圍不大的情況,假設(shè)范圍是0到k,那么計數(shù)排序就是直接分配k+1個桶,每個桶內(nèi)的數(shù)值都是相等的,省掉了桶內(nèi)排序的過程。
    舉個例子:假設(shè)某省50萬考生,需要根據(jù)成績排序。成績的范圍是0-750,那么就可以申請一個長度為751的數(shù)組,下標對應(yīng)分數(shù)0到750。遍歷這50萬的數(shù)據(jù),對應(yīng)分數(shù)上統(tǒng)計數(shù)量。最后只需要依次遍歷這個數(shù)組:假設(shè)下標為0(即分數(shù)為0)的統(tǒng)計有100個,那么直接輸出100個0;下標為1的有3個,那么再往后追加輸出3個1;……直到下標為750,即可完成排序。因為只涉及掃描遍歷操作,所以時間復(fù)雜度是O(n)。
    使用場景:只能用于數(shù)據(jù)范圍不大的情況,且數(shù)據(jù)都是正整數(shù)的情況(如果不是,需要先進行處理)。
    備注:最終完成排序的數(shù)組,也可以使用前綴和的方式來實現(xiàn),這個方法有點繞,有興趣的可以自己百度了解下。

    10 基數(shù)排序

    原理是將整數(shù)按位數(shù)切割成不同的數(shù)字,然后按每個位數(shù)分別歸類。由于整數(shù)也可以表達字符串(比如名字或日期)和特定格式的浮點數(shù),所以基數(shù)排序也不是只能使用于整數(shù)。

    舉個例子:給10萬個手機號碼從小到大排序。
    借助于穩(wěn)定排序算法,從后往前,對手機號碼的每一位進行穩(wěn)定排序,如可以使用桶排序或者計數(shù)排序,即先對所有手機號的第10位進行桶排序,再對第0位……直到第0位。每次桶排序的時間復(fù)雜度為O(N),假設(shè)要進行k次排序,則基數(shù)排序的時間復(fù)雜度為o(kN)。由于手機號通常是11位,所以這里時間復(fù)雜度為O(11N),近似O(N)。
    此外,如果待排序的字符串的長度不一致,可以先補"0",因為根據(jù)ASCII值,所有字母都大于“0”,所以補“0”不會影響到原有的大小順序。這樣就可以繼續(xù)用基數(shù)排序了。

    總結(jié)

    以上是生活随笔為你收集整理的常见排序算法的时间复杂度汇总的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。