導航:首頁 > 源碼編譯 > 九種排序演算法的時間復雜度

九種排序演算法的時間復雜度

發布時間:2023-03-27 16:53:21

❶ 排序演算法的時間復雜度

所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。排序演算法,就是如何使得記錄按照要求排列的方法。排序演算法在很多領域得到相當地重視,尤其是在大量數據的處理方面。

一個優秀的演算法可以節省大量的資源。在各個領域中考慮到數據的各種限制和規范,要得到一個符合實際的優秀演算法,得經過大量的推理和分析。

空間復雜度(Space Complexity)是對一個演算法在運行過程中臨時佔用存儲空間大小的量度,記做S(n)=O(f(n))。比如直接插入排序的時間復雜度是O(n^2),空間復雜度是O(1) 。

而一般的遞歸演算法就要有O(n)的空間復雜度了,因為每次遞歸都要存儲返回信息。一個演算法的優劣主要從演算法的執行時間和所需要佔用的存儲空間兩個方面衡量。

(1)九種排序演算法的時間復雜度擴展閱讀:

排序演算法經過了很長時間的演變,產生了很多種不同的方法。對於初學者來說,對它們進行整理便於理解記憶顯得很重要。每種演算法都有它特定的使用場合,很難通用。因此,我們很有必要對所有常見的排序演算法進行歸納。

排序大的分類可以分為兩種:內排序和外排序。在排序過程中,全部記錄存放在內存,則稱為內排序,如果排序過程中需要使用外存,則稱為外排序。下面講的排序都是屬於內排序。

內排序有可以分為以下幾類:

(1)、插入排序:直接插入排序、二分法插入排序、希爾排序。

(2)、選擇排序:直接選擇排序、堆排序。

(3)、交換排序:冒泡排序、快速排序。

(4)、歸並排序

(5)、基數排序

❷ 常見排序演算法以及對應的時間復雜度和空間復雜度

排序 :將雜亂無章的數據,按照一定的方法進行排列的過程叫做排序。

排序大的分類可分為 內排序 外排序 ,不需要訪問外存就能進行排序的叫做內排序。

排序也可以分為 穩定排序 不穩定排序

穩定排序 :假設在待排序的文件中,存在兩個或兩個以上的記錄具有相同的關鍵字,在用某種排序法排序後,若這些相同關鍵字的元素的相對次序仍然不變,則這種排序方法是穩定的。即;若 a[i]=a[j] , a[i] a[j] 之前,經過排序後 a[i] 依然在 a[j] 之前。冒泡排序、直接插入排序、二分插入排序、歸並排序,基數排序都是穩定排序。
不穩定排序 :直接選擇排序、堆排序、快速排序、希爾排序,猴子排序。

以升序為例,比較相鄰的元素,如果第一個比第二個大,則交換他們兩個。如果兩個元素一樣大,則繼續比較下一對。所以冒泡排序是一種穩定排序。

選擇一個基準元素,通常選擇第一個元素或者最後一個元素,通過一趟掃描,將待排序列分成兩部分,一部分比基準元素小,一部分大於等於基準元素,此時基準元素在其排好序後的正確位置,然後再用同樣的方法遞歸地排序劃分的兩部分。快速排序是不穩定排序。

將序列分為兩個部分{{有序序列},{無序}},每次處理就是將無序數列的第一個元素與有序數列的元素從後往前逐個進行比較,找出插入位置,將該元素插入到有序數列的合適位置中。如果碰到相等的元素,就會把它插入到想等元素後面,順序不會改變,所以直接插入排序是穩定排序。

在直接插入排序的基礎上,對有序序列進行劃分。例如:序列為 {{a[0]......a[i-1]},a[i]} 其中 {a[0]......a[i-1]} 為有序序列,取 a[(i-1)/2] ,將其與 a[i] 比較,即可確定 a[i] 的范圍 (a[0]...a[(i-1)/2] 或者 a[(i-1)/2]...a[i-1]) ,然後繼續在已確定的范圍內進行二分。范圍依次縮小為: 1/2、1/4、1/8、1/16...... 可快速確定a[i]應該插入的位置。二分插入排序也是穩定排序。

將整個序列分割成若干個小的子序列,每個子序列內分別進行插入排序。一般情況下步長取n/2。直到最後一次步長為1,即所有元素在一個組中進行排序。由於希爾排序是先將整個序列劃分為多個子序列進行排序,相同的元素順序在這個過程中順序可能會被打亂,所以希爾排序是不穩定排序。

從待排序的數據元素中,選出最小或最大的元素與序列第一個數交換。直到所有數據排完。直接選擇排序是不穩定排序。例如: {3,3,1} ,第一次排序就將1和第一個3交換,想等元素的順序改變了。

以n=10的一個數組49, 38, 65, 97, 26, 13, 27, 49, 55, 4為例

堆排序是一種樹形選擇排序,是對直接選擇排序的有效改進。
最大堆:每個節點的值都大於等於它的孩子節點。
最小堆:每個節點的值都小於等於它的孩子節點。
最大堆第0個數據是最大數,最小堆第0個數據是最小數。
堆排序是不穩定排序

思想

歸並排序是建立在歸並操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。
如何將兩個有序序列合並?(升序)
{a[0]......a[i-1]},{b[0]......b[j-1]}
b[0]<a[0] ,取 b[0] 放入數組 c 中,然後繼續比較數組 a b 中的第一個元素,直到數組 a b 中最後一對元素比較完成。

思想

將數組分成二組 a , b 如果這二組組內的數據都是有序的,那麼就可以按照上述方法對這二組數據進行排序。如果這二組數據是無序的?
可以將 a , b 組各自再分成二組。遞歸操作,直到每個小組只有一個數據,每個小組只有一個元素所以我們可以認為它已經是有序序列,然後進行合並。
先分解後合並。
歸並排序是穩定排序

將所有待比較數值(正整數)統一為同樣的數位長度,數位較短的數前面補零。從最低位起從0-9依次掃描序列,一邊掃描一邊將掃描到的數據加到新的序列中,得到一個序列。然後比較高一位,重復上述操作,直到最高位排序完成。數列就變成一個有序序列。基數排序是穩定排序。

以全是二位數的序列舉例

無限猴子定理 :指一隻猴子隨機在打字機鍵盤上按鍵,最後必然可以打出法國國家圖書館的每本圖書。

時間復雜度最低1次,最高可執行到世界的盡頭。。。

❸ 快速排序法的平均時間復雜度和最壞時間復雜度分別是多少

快速排序的平均時間復雜度和最壞時間復雜度分別是O(nlgn)、O(n^2)。

當排序已經成為基本有序狀態時,快速排序退化為O(n^2),一般情況下,排序為指數復雜度。

快速排序最差情況遞歸調用棧高度O(n),平均情況遞歸調用棧高度O(logn),而不管哪種情況棧的每一層處理時間都是O(n),所以,平均情況(最佳情況也是平均情況)的時間復雜度O(nlogn),最差情況的時間復雜度為O(n^2)。



(3)九種排序演算法的時間復雜度擴展閱讀

快速排序是C.R.A.Hoare於1962年提出的一種劃分交換排序,它採用了一種分治的策略,通常稱其為分治法。快速排序演算法通過多次比較和交換來實現排序,其排序流程如下:

(1)首先設定一個分界值,通過該分界值將數組分成左右兩部分。

(2)將大於或等於分界值的數據集中到數組右邊,小於分界值的數據集中到數組的左邊。此時,左邊部分中各元素都小於或等於分界值,而右邊部分中各元素都大於或等於分界值。

(3)然後,左邊和右邊的數據可以獨立排序。對於左側的數組數據,又可以取一個分界值,將該部分數據分成左右兩部分,同樣在左邊放置較小值,右邊放置較大值。右側的數組數據也可以做類似處理。

(4)重復上述過程,可以看出,這是一個遞歸定義。通過遞歸將左側部分排好序後,再遞歸排好右側部分的順序。當左、右兩個部分各數據排序完成後,整個數組的排序也就完成了。

❹ 各種排序法的時間復雜度到底多少

根據《演算法導論(中文版)》P83表格以及《演算法(中文版)》部分章節內容:

演算法最壞情況運行時間平均情況

冒泡&&插入&&選擇排序 n^2n^2

快速排序n^2 n*log n

希爾排序(希爾增量) n^2 n^(1.3 - 2)

堆排序 n*log n n*log n

註:希爾排序的性能依賴於選擇的增量。

❺ 所有排序演算法的時間復雜度

冒泡排序是這樣實現的:

首先將所有待排序的數字放入工作列表中。

從列表的第一個數字到倒數第二個數字,逐個檢查:若某一位上的數字大於他的下一位,則將它與它的下一位交換。

重復2號步驟,直至再也不能交換。

冒泡排序的平均時間復雜度與插入排序相同,也是平方級的,但也是非常容易實現的演算法。

選擇排序

選擇排序是這樣實現的:

設數組內存放了n個待排數字,數組下標從1開始,到n結束。

i=1

從數組的第i個元素開始到第n個元素,尋找最小的元素。

將上一步找到的最小元素和第i位元素交換。

如果i=n-1演算法結束,否則回到第3步

選擇排序的平均時間復雜度也是O(n^2)的。

❻ 幾種排序的時間復雜度排序

從時間復雜度看,所有內部排序方法可以分為兩類。
1.插入排序 選擇排序 起泡排序
其時間復雜度為O(n2);
2.堆排序 快速排序 歸並排序
其時間復雜度為O(nlog2n)。
這是就平均情況而言的,如果從最好的情況考慮,
則插入排序和起泡排序的時間復雜度最好,為O(n),
而其他演算法的最好情況同平均情況大致相同。
如果從最壞的情況考慮,快速排序的時間復雜度為O(n2),插入排序和起泡排序雖然同平均情況相同,但系數大約增加一倍,運行速度降低一半,而選擇排序、堆排序和歸並排序則影響不大。

❼ C語言 各常見排序法的時間復雜度 急 請簡單說明

選擇排序演算法復雜度是O(n^2)。
插入排序是O(n^2)
快速排序快速排序是不穩定的。最理想情況演算法時間復雜度O(nlog2n),最壞O(n^2)。
堆排序演算法時間復雜度O(nlogn)。
歸並排序的時間復雜度是O(nlog2n)。

❽ 排序演算法的時間復雜度是多少

排序演算法的時間復雜度是T(n)。

演算法中基本操作重復執行的次數是問題規模n的某個函數,用T(n)表示,若有某個輔助函數f(n),使得當n趨近於無窮大時,T(n)/f (n)的極限值為不等於零的常數,則稱f(n)是T(n)的同數量級函數。記作T(n)=O(f(n)),稱O(f(n)) 為演算法的漸進時間復雜度,簡稱時間復雜度。

性質:

一個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多。

在各種不同演算法中,若演算法中語句執行次數為一個常數,則時間復雜度為O(1),另外,在時間頻度不相同時,時間復雜度有可能相同,如T(n)=n2+3n+4與T(n)=4n2+2n+1它們的頻度不同,但時間復雜度相同,都為O(n2)。

❾ 常見的排序演算法以及時間復雜度

在常見的排序演算法中,冒泡排序,選擇排序和直接插入排序都是O(N平方)的。快速排序,歸並排序,2叉排序樹排序。都是O(NLogN)的。小學生排序則是O(N)的。

❿ 求各種查找和排序的時間復雜度

冒泡排序是穩定的,演算法時間復雜度是O(n ^2)。

2.2 選擇排序(Selection Sort)

選擇排序的基本思想是對待排序的記錄序列進行n-1遍的處理,第i遍處理是將L[i..n]中最小者與L[i]交換位置。這樣,經過i遍處理之後,前i個記錄的位置已經是正確的了。

選擇排序是不穩定的,演算法復雜度是O(n ^2 )。

2.3 插入排序 (Insertion Sort)

插入排序的基本思想是,經過i-1遍處理後,L[1..i-1]己排好序。第i遍處理僅將L[i]插入L[1..i-1]的適當位置,使得L[1..i] 又是排好序的序列。要達到這個目的,我們可以用順序比較的方法。首先比較L[i]和L[i-1],如果L[i-1]≤ L[i],則L[1..i]已排好序,第i遍處理就結束了;否則交換L[i]與L[i-1]的位置,繼續比較L[i-1]和L[i-2],直到找到某一個位置j(1≤j≤i-1),使得L[j] ≤L[j+1]時為止。圖1演示了對4個元素進行插入排序的過程,共需要(a),(b),(c)三次插入。

直接插入排序是穩定的,演算法時間復雜度是O(n ^2) 。

2.4 堆排序

堆排序是一種樹形選擇排序,在排序過程中,將A[n]看成是完全二叉樹的順序存儲結構,利用完全二叉樹中雙親結點和孩子結點之間的內在關系來選擇最小的元素。

堆排序是不穩定的,演算法時間復雜度O(nlog n)。

2.5 歸並排序

設有兩個有序(升序)序列存儲在同一數組中相鄰的位置上,不妨設為A[l..m],A[m+1..h],將它們歸並為一個有序數列,並存儲在A[l..h]。

其時間復雜度無論是在最好情況下還是在最壞情況下均是O(nlog2n)。

2.6 快速排序

快速排序是對冒泡排序的一種本質改進。它的基本思想是通過一趟掃描後,使得排序序列的長度能大幅度地減少。在冒泡排序中,一次掃描只能確保最大數值的數移到正確位置,而待排序序列的長度可能只減少1。快速排序通過一趟掃描,就能確保某個數(以它為基準點吧)的左邊各判山數都比它小,右邊晌沖圓各數都比它大。然後又用同樣的方法處理它左右兩邊的數,直到基準點的左右只有一個元素為止。

快速排序是不穩定的,最理宴塌想情況演算法時間復雜度O(nlog2n),最壞O(n ^2)。

2.7 希爾排序

在直接插入排序演算法中,每次插入一個數,使有序序列只增加1個節點,並且對插入下一個數沒有提供任何幫助。如果比較相隔較遠距離(稱為 增量)的數,使得數移動時能跨過多個元素,則進行一次比較就可能消除多個元素交換。D.L.shell於1959年在以他名字命名的排序演算法中實現了這一思想。演算法先將要排序的一組數按某個增量d分成若干組,每組中記錄的下標相差d.對每組中全部元素進行排序,然後再用一個較小的增量對它進行,在每組中再進行排序。當增量減到1時,整個要排序的數被分成一組,排序完成。

希爾排序是不穩定的,其時間復雜度為O(n ^2)。

排序類別
時間復雜度
空間復雜度
穩定

1
插入排序
O(n2)
1


2
希爾排序
O(n2)
1
×

3
冒泡排序
O(n2)
1


4
選擇排序
O(n2)
1
×

5
快速排序
O(Nlogn)
O(logn)
×

6
堆排序
O(Nlogn)
1
×

7
歸並排序
O(Nlogn)
O(n)

閱讀全文

與九種排序演算法的時間復雜度相關的資料

熱點內容
如來佛祖命令雷神去下界 瀏覽:854
新電腦管家下載好怎麼解壓 瀏覽:528
php獲取介面數據 瀏覽:763
最後的命令 瀏覽:921
如何添加手機app桌面快捷圖標 瀏覽:427
ui設計師與程序員 瀏覽:417
壽司pdf 瀏覽:828
pythonbg是什麼 瀏覽:248
c數值演算法程序大全 瀏覽:785
android整點報時 瀏覽:221
稀土pdf 瀏覽:536
單片機電子鎖 瀏覽:596
通達信機智資金流指標公式源碼 瀏覽:216
php安裝xsl擴展 瀏覽:842
python如何使用help 瀏覽:367
上汽榮威app在哪裡查詢 瀏覽:903
冰櫃壓縮機溫度108 瀏覽:720
阿里雲郵smtp伺服器地址 瀏覽:252
解壓館認知理解 瀏覽:239
為什麼使用非官方伺服器會封號 瀏覽:9