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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

7大排序时间复杂度对比、以及优化

發布時間:2023/12/10 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 7大排序时间复杂度对比、以及优化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

數據結構:計算機組織存儲數據的方式
算法:作用于特定數據集上的算法流程


如何衡量一個排序算法的優劣?
1.算法的執行效率
-要看最好、最壞、平均時間復雜度
-有時候個數n太少也要考慮時間復雜度的系數、低階、常數(冒泡和插入)
-比較或交換的次數

2.算法的內存消耗
-通過空間復雜度來衡量
-原地排序:特指空間復雜度為O(1)的排序算法(就是給定有限個數的空間)

3.算法的穩定性【重點】
-穩定性:若待排序的集合中存在值相等的元素,經過排序之后,相等元素之間原有的順序是否改變,若未改變則穩定性排序。
//也就是看兩個值相等的話,要不要進行排序,或是不改變它們跳到下一次比較。
栗子:訂單排序中,如何按照金額排序后,相同金額的時間也是按順序的?
解決:先按照時間排序,再按照金額穩定性排序


排序的分類:【7種】

動圖解釋原理[這里]

內部排序(默認)
排序過程無需借助外部存儲器(磁盤),所有操作均在內存中完成。

  • 插入排序
    -直接插入排序:
    時間復雜度:O(n^2)
    空間復雜度:O(1)
    穩定性:穩定
    -希爾排序
    時間復雜度:O(n1.5~n2)
    空間復雜度:O(1)
    穩定性:根據具體代碼
  • 選擇排序
    -選擇排序
    時間復雜度:O(n^2)
    空間復雜度:O(1)
    穩定性:不穩定
    -堆排序(二叉樹)
    時間復雜度:O(nlogn)
    空間復雜度:O(1)
    穩定性:不穩定
  • 交換排序
    -冒泡排序
    時間復雜度:O(n^2)
    空間復雜度:O(1)
    穩定性:穩定
    -快速排序(分治思想)
    時間復雜度:O(nlogn)
    空間復雜度:O(1)
    穩定性:不穩定
  • 歸并排序
    -歸并排序(分治思想)
    時間復雜度:O(nlogn)
    空間復雜度:O(1)
    穩定性:穩定
    ------------------------掌握思想、會寫、會分析兩個復雜度---------------------------

外部排序
若參與排序的元素過多,數據量過大,內存放不下,需要借助外部存儲器進行。(桶排序)

【無論是內部排序還是外部排序,最終數據的排序一定在內存中進行。】


1.冒泡排序

只操作相鄰的兩個元素,每次對相鄰的兩個元素做大小比較,看是否滿足大小關系,不滿足則交換,每次操作都保證至少有一個元素移動到最終位置
優化:設置標志位,在n次循環并沒有元素交換,表示排序完畢跳出循環。

時間復雜度:
最好情況:o(n)
最壞情況:O(n^2)
平均復雜度:O(n^2)

空間復雜度:O(1)
-沒有開辟新的空間
-所以冒泡排序是一個原地排序

穩定性:穩定


2.直接插入排序

基于有序數組元素的插入而來。
適用:近乎有序的集合。
思想:將待排序數據分為兩個區間,已排序區間和待排序區間。

步驟:一開始已排序區間只有一個元素
首先找到要插入的位置,再將數據插入到特定位置,保持數組的有序性。
從后向前,若是比插入數大,則往后退一位。若比插入數小,則直接插入后面。
直到找到比它小的,插入到其后。

時間復雜度:
最好情況:o(n)
最壞情況:O(n^2)
平均復雜度:O(n^2)

空間復雜度:O(1)
-沒有開辟新的空間
-所以冒泡排序是一個原地排序
穩定性:穩定

優化:折半插入排序,時間減少一半。


冒泡排序和直接插入排序的復雜度一樣
為什么實際上用直接插入更多?

在萬數量級 冒泡:100ms+ 插入:10ms+
在十萬數量級 冒泡:15000ms+ 插入:800ms+

原因:交換次數
冒泡-交換3次
插入-交換1次


3.希爾排序

相比直插,優化了搬運的速率

類似于直插排序
找出未排序集合最小值,放到第一位

時間復雜度:
最好情況:o(n)
最壞情況:O(n^2)
平均復雜度:O(n^2)

空間復雜度:O(1)

穩定性:不穩定


所以插入和選擇優先插入,因為其穩定性,且二者效率相差不大


4.歸并排序

分治思想: 將一個大的問題分成n個足夠小的問題,當所有小問題解決后,將結果合并起來就是整個問題的求解。

所有能使用分治思想解決的問題均可利用遞歸的技巧完美解決。
時間復雜度:
平均復雜度:O(nlogn)
O(n)是merge函數的 O(logn)是分組函數的

空間復雜度:O(n)
臨時數組在合并后空間會釋放

穩定性:取決于合并函數的寫法 arr[i] <= arr[j]


5.快速排序

最重要的算法之一
基于分治思想
思想 : 從待排序的數組中任取一個任意元素,稱為分區點,開始遍歷過程,每當發現小于分區點的元素放到分區點左邊,反之。每遍歷一遍會把基準值放在最終位置。

最壞情況:
當待排序元素近乎有序時,若選取的元素恰好為最大值則整個樹只有左子樹,即成了一個O(n),此時時間復雜度退化為O(n^2)
最好情況:
每次的分區點都是中間元素,即左右子樹差不多,O(nlogn)
平均:
O(nlogn)

空間復雜度:O(1)【原地排序】
穩定性:不穩定算法

優化:
問題:基準值的選取每次都選最大值或最小值,都大于或者小于基準值,整個樹只有左子樹。O(n^2)
解決:隨機選取基準值
int random = (int)(Math.random()*(end-start+1)+start);
swap(array,random,start);

問題:當待排序集合包含大量重復元素時,與基準值相等的元素太多,整個數又只有右子樹。O(n^2)
解決:二路快排。將大于和小于key的元素放在數組兩端,i不斷向后,j不斷向前。i小于key,i++。j小于等于key,j–。否則和兩端交換。直到i>j停止。

思考:
在O(n)之內找到一個無序數組的第k大值?

若走完一遍后i+1 = k;那么array[i+1]就是第k大的數。
若是 i+1 < k,在i+1右邊找。
若 i+1 >k,在i+1左邊找。


6.選擇排序

思想 : 遍歷未排序區域選擇一個最小的值和區域中第一個元素交換,并把第一個元素放到已排序區域中,直到未排序區域沒有元素。

時間復雜度:O(n^2)
空間復雜度:O(1)
穩定性:不穩定


7.堆排序

思想 : 先取基準數建立一個堆,取堆頂元素后將剩余元素組成一個新堆,重復直到取出所有元素。
注意這個堆構成完全二叉樹,且這個樹所有非終端點的值不大于或者不小于其左右子樹。也就是說根節點是當時的最大值或最小值。

也是利用了遞歸思想,先排再取。

時間復雜度:O(nlogn)
空間復雜度:O(1)
穩定性:不穩定


O(n^2) : 插排、冒泡、選擇
運用遞歸 : 歸并、快排、堆排
O(nlogn) : 歸并、堆排、快排(時間復雜度不穩定:當快排最壞的情況,時間復雜度變為O(n^2))
不穩定排序 : 希爾、選擇、快排、堆排
穩定排序 : 直插 、 冒泡 、 歸并


總結

以上是生活随笔為你收集整理的7大排序时间复杂度对比、以及优化的全部內容,希望文章能夠幫你解決所遇到的問題。

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