久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

基本排序算法比較與選擇

 橙zc 2014-08-13

前幾天應(yīng)一個朋友的要求,,幫他完成了數(shù)據(jù)排序的一個作業(yè),。覺得很有給大家參考的價值,所以經(jīng)過他同意,,作了些修改帖了上來,。源代碼見附件,代碼中實現(xiàn)了8種排序算法,各算法名稱見下表或見源碼,。運行程序時,,將需要你輸入一數(shù)值,以確定對多少隨機數(shù)進(jìn)行排序,。然后將會顯示各排序算法的耗時,。并且你可選擇時否進(jìn)行正序和反序測試。

由于水平有限,,可能存在一些錯誤,,還請各位多多指點!

通過實驗我們可將結(jié)果列入下表,。

以下是VC6.0(Release)+win2000pro+128MDDR+P4(1.6G)

因為在多任務(wù)操作系統(tǒng)下,,系統(tǒng)將進(jìn)行進(jìn)程序調(diào)度,影響實驗結(jié)果,。以下是經(jīng)過稍微修正過的值,。如果要取得更準(zhǔn)確的值,我們得多次實驗求其平均值,。

排序算法實驗比較(單位:秒)

n

方法

1K

10K

100K

200K

100K

正序

逆序

冒泡排序

0

0.422

44.790

188.462

0

31.459

冒泡排序2

0

0.281

30.335

131.771

0

27.568

快速排序

0

0

0.016

0.047

5.095

7.002

直接選擇排序

0

0.141

16.878

79.332

16.785

33.242

堆排序

0

0

0.031

0.109

0.031

0.015

直接插入排序

0

0.047

8.705

57.800

0

24.865

Shell排序

0

0

0.047

0.110

0.015

0.015

歸并排序

0

0

0.031

0.094

0.032

0.032

基數(shù)排序

0

0

0.47

0.109

0.047

0.046

算法與結(jié)果聯(lián)合分析

冒泡排序:在最優(yōu)情況下只需要經(jīng)過n-1次比較即可得出結(jié)果,,(這個最優(yōu)情況那就是序列己是正序,從100K的正序結(jié)果可以看出結(jié)果正是如此),,但在最壞情況下,,即倒序(或一個較小值在最后),下沉算法將需要n(n-1)/2次比較,。所以一般情況下,,特別是在逆序時,它很不理想,。它是對數(shù)據(jù)有序性非常敏感的排序算法,。

冒泡排序2:它是冒泡排序的改良(一次下沉再一次上浮),,最優(yōu)情況和最壞情況與冒泡排序差不多,,但是一般情況下它要好過冒泡排序,它一次下沉,,再一次上浮,,這樣避免了因一個數(shù)的逆序,而造成巨大的比較,。如(2,3,4,…,n-1,n,1),,用冒泡排序需要n(n-1)/2次比較,而此排序只要3輪,共比較(n-1)+(n-2)+(n-3)次,,第一輪1將上移一位,,第二輪1將移到首位,,第三輪將發(fā)現(xiàn)無數(shù)據(jù)交換,序列有序而結(jié)束,。但它同樣是一個對數(shù)據(jù)有序性非常敏感的排序算法,,只適合于數(shù)據(jù)基本有序的排序。

快速排序:它同樣是冒泡排序的改進(jìn),,它通過一次交換能消除多個逆序,,這樣可以減少逆序時所消耗的掃描和數(shù)據(jù)交換次數(shù)。在最優(yōu)情況下,,它的排序時間復(fù)雜度為O(nlog2n),。即每次劃分序列時,能均勻分成兩個子串,。但最差情況下它的時間復(fù)雜度將是O(n^2),。即每次劃分子串時,一串為空,,另一串為m-1(程序中的100K正序和逆序就正是這樣,,如果程序中采用每次取序列中部數(shù)據(jù)作為劃分點,那將在正序和逆時達(dá)到最優(yōu)),。從100K中正序的結(jié)果上看“快速排序”會比“冒泡排序”更慢,,這主要是“冒泡排序”中采用了提前結(jié)束排序的方法。有的書上這解釋“快速排序”,,在理論上講,,如果每次能均勻劃分序列,它將是最快的排序算法,,因此稱它作快速排序,。雖然很難均勻劃分序列,但就平均性能而言,,它仍是基于關(guān)鍵字比較的內(nèi)部排序算法中速度最快者,。

直接選擇排序:簡單的選擇排序,它的比較次數(shù)一定:n(n-1)/2,。也因此無論在序列何種情況下,,它都不會有優(yōu)秀的表現(xiàn)(從上100K的正序和反序數(shù)據(jù)可以發(fā)現(xiàn)它耗時相差不多,相差的只是數(shù)據(jù)移動時間),,可見對數(shù)據(jù)的有序性不敏感,。它雖然比較次數(shù)多,,但它的數(shù)據(jù)交換量卻很少,。所以我們將發(fā)現(xiàn)它在一般情況下將快于冒泡排序。

堆排序:由于它在直接選擇排序的基礎(chǔ)上利用了比較結(jié)果形成,。效率提高很大,。它完成排序的總比較次數(shù)為O(nlog2n),。它是對數(shù)據(jù)的有序性不敏感的一種算法。但堆排序?qū)⑿枰鰞蓚€步驟:-是建堆,,二是排序(調(diào)整堆),。所以一般在小規(guī)模的序列中不合適,但對于較大的序列,,將表現(xiàn)出優(yōu)越的性能,。

直接插入排序:簡單的插入排序,每次比較后最多移掉一個逆序,,因此與冒泡排序的效率相同,。但它在速度上還是要高點,這是因為在冒泡排序下是進(jìn)行值交換,,而在插入排序下是值移動,,所以直接插入排序?qū)⒁獌?yōu)于冒泡排序。直接插入法也是一種對數(shù)據(jù)的有序性非常敏感的一種算法,。在有序情況下只需要經(jīng)過n-1次比較,,在最壞情況下,將需要n(n-1)/2次比較,。

希爾排序:增量的選擇將影響希爾排序的效率,。但是無論怎樣選擇增量,最后一定要使增量為1,,進(jìn)行一次直接插入排序,。但它相對于直接插入排序,由于在子表中每進(jìn)行一次比較,,就可能移去整個經(jīng)性表中的多個逆序,,從而改善了整個排序性能。希爾排序算是一種基于插入排序的算法,,所以對數(shù)據(jù)有序敏感,。

歸并排序:歸并排序是一種非就地排序,將需要與待排序序列一樣多的輔助空間,。在使用它對兩個己有序的序列歸并,,將有無比的優(yōu)勢。其時間復(fù)雜度無論是在最好情況下還是在最壞情況下均是O(nlog2n),。對數(shù)據(jù)的有序性不敏感,。若數(shù)據(jù)節(jié)點數(shù)據(jù)量大,那將不適合,。但可改造成索引操作,,效果將非常出色。

基數(shù)排序:在程序中采用的是以數(shù)值的十進(jìn)制位分解,,然后對空間采用一次性分配,,因此它需要較多的輔助空間(10*n+10), (但我們可以進(jìn)行其它分解,,如以一個字節(jié)分解,空間采用鏈表將只需輔助空間n+256),?;鶖?shù)排序的時間是線性的(即O(n))。由此可見,,基數(shù)排序非常吸引人,,但它也不是就地排序,若節(jié)點數(shù)據(jù)量大時宜改為索引排序,。但基數(shù)排序有個前提,要關(guān)鍵字能象整型,、字符串這樣能分解,,若是浮點型那就不行了。

按平均時間將排序分為類:
(1) 平方階(O(n2))排序
  各類簡單排序,,例如直接插入,、直接選擇和冒泡排序;
(2) 線性對數(shù)階(O(nlog2n))排序
  如快速排序,、堆排序歸并排序,;
(3) O(n1+§))排序
  §是介于0和1之間的常數(shù),。希爾排序便是一種,;
(4) 線性階(O(n))排序
  本程序中的基數(shù)排序,,此外還有桶,、箱排序。


排序方法的選擇

因為不同的排序方法適應(yīng)不同的應(yīng)用環(huán)境和要求,,所以選擇合適的排序方法很重要
(1)
n較小,,可采用直接插入或直接選擇排序。
當(dāng)記錄規(guī)模較小時,,直接插入排序較好,它會比選擇更少的比較次數(shù),;

但當(dāng)記錄規(guī)模較大時,,因為直接選擇移動的記錄數(shù)少于直接插人,所以宜用選直接選擇排序,。
這兩種都是穩(wěn)定排序算法,。
(2)若文件初始狀態(tài)基本有序(指正序),則應(yīng)選用直接插人,、冒泡或隨機的快速排序為宜(這里的隨機是指基準(zhǔn)取值的隨機,,原因見上的快速排序分析);這里快速排序算法將不穩(wěn)定,。

(3)
n較大,,則應(yīng)采用時間復(fù)雜度為O(nlog2n)的排序方法:快速排序、堆排序或歸并排序序,。
快速排序是目前基于比較的內(nèi)部排序中被認(rèn)為是最好的方法,,當(dāng)待排序的關(guān)鍵字是隨機分布時,快速排序的平均時間最短,;
堆排序雖不會出現(xiàn)快速排序可能出現(xiàn)的最壞情況,。但它需要建堆的過程。這兩種排序都是不穩(wěn)定的,。
 
歸并排序是穩(wěn)定的排序算法,,但它有一定數(shù)量的數(shù)據(jù)移動,所以我們可能過與插入排序組合,,先獲得一定長度的序列,,然后再合并,在效率上將有所提高,。
(4)特殊的箱排序,、基數(shù)排序

它們都是一種穩(wěn)定的排序算法,但有一定的局限性:
  1,、關(guān)鍵字可分解,。

  2
、記錄的關(guān)鍵字位數(shù)較少,,如果密集更好
  3,、如果是數(shù)字時,最好是無符號的,,否則將增加相應(yīng)的映射復(fù)雜度,,可先將其正負(fù)分開排序。


前幾天應(yīng)一個朋友的要求,,幫他完成了數(shù)據(jù)排序的一個作業(yè),。覺得很有給大家參考的價值,所以經(jīng)過他同意,,作了些修改帖了上來,。源代碼見附件,代碼中實現(xiàn)了8種排序算法,,各算法名稱見下表或見源碼,。運行程序時,,將需要你輸入一數(shù)值,以確定對多少隨機數(shù)進(jìn)行排序,。然后將會顯示各排序算法的耗時,。并且你可選擇時否進(jìn)行正序和反序測試。

由于水平有限,,可能存在一些錯誤,,還請各位多多指點!

通過實驗我們可將結(jié)果列入下表,。

以下是VC6.0(Release)+win2000pro+128MDDR+P4(1.6G)

因為在多任務(wù)操作系統(tǒng)下,,系統(tǒng)將進(jìn)行進(jìn)程序調(diào)度,影響實驗結(jié)果,。以下是經(jīng)過稍微修正過的值,。如果要取得更準(zhǔn)確的值,我們得多次實驗求其平均值,。

排序算法實驗比較(單位:秒)

n

方法

1K

10K

100K

200K

100K

正序

逆序

冒泡排序

0

0.422

44.790

188.462

0

31.459

冒泡排序2

0

0.281

30.335

131.771

0

27.568

快速排序

0

0

0.016

0.047

5.095

7.002

直接選擇排序

0

0.141

16.878

79.332

16.785

33.242

堆排序

0

0

0.031

0.109

0.031

0.015

直接插入排序

0

0.047

8.705

57.800

0

24.865

Shell排序

0

0

0.047

0.110

0.015

0.015

歸并排序

0

0

0.031

0.094

0.032

0.032

基數(shù)排序

0

0

0.47

0.109

0.047

0.046

算法與結(jié)果聯(lián)合分析

冒泡排序:在最優(yōu)情況下只需要經(jīng)過n-1次比較即可得出結(jié)果,,(這個最優(yōu)情況那就是序列己是正序,從100K的正序結(jié)果可以看出結(jié)果正是如此),,但在最壞情況下,,即倒序(或一個較小值在最后),下沉算法將需要n(n-1)/2次比較,。所以一般情況下,,特別是在逆序時,它很不理想,。它是對數(shù)據(jù)有序性非常敏感的排序算法,。

冒泡排序2:它是冒泡排序的改良(一次下沉再一次上浮),,最優(yōu)情況和最壞情況與冒泡排序差不多,,但是一般情況下它要好過冒泡排序,它一次下沉,,再一次上浮,,這樣避免了因一個數(shù)的逆序,而造成巨大的比較,。如(2,3,4,…,n-1,n,1),,用冒泡排序需要n(n-1)/2次比較,而此排序只要3輪,共比較(n-1)+(n-2)+(n-3)次,,第一輪1將上移一位,,第二輪1將移到首位,第三輪將發(fā)現(xiàn)無數(shù)據(jù)交換,序列有序而結(jié)束,。但它同樣是一個對數(shù)據(jù)有序性非常敏感的排序算法,,只適合于數(shù)據(jù)基本有序的排序。

快速排序:它同樣是冒泡排序的改進(jìn),,它通過一次交換能消除多個逆序,,這樣可以減少逆序時所消耗的掃描和數(shù)據(jù)交換次數(shù)。在最優(yōu)情況下,,它的排序時間復(fù)雜度為O(nlog2n),。即每次劃分序列時,,能均勻分成兩個子串。但最差情況下它的時間復(fù)雜度將是O(n^2)。即每次劃分子串時,,一串為空,,另一串為m-1(程序中的100K正序和逆序就正是這樣,如果程序中采用每次取序列中部數(shù)據(jù)作為劃分點,,那將在正序和逆時達(dá)到最優(yōu)),。從100K中正序的結(jié)果上看“快速排序”會比“冒泡排序”更慢,這主要是“冒泡排序”中采用了提前結(jié)束排序的方法,。有的書上這解釋“快速排序”,,在理論上講,如果每次能均勻劃分序列,,它將是最快的排序算法,,因此稱它作快速排序。雖然很難均勻劃分序列,,但就平均性能而言,,它仍是基于關(guān)鍵字比較的內(nèi)部排序算法中速度最快者。

直接選擇排序:簡單的選擇排序,,它的比較次數(shù)一定:n(n-1)/2,。也因此無論在序列何種情況下,它都不會有優(yōu)秀的表現(xiàn)(從上100K的正序和反序數(shù)據(jù)可以發(fā)現(xiàn)它耗時相差不多,,相差的只是數(shù)據(jù)移動時間),,可見對數(shù)據(jù)的有序性不敏感。它雖然比較次數(shù)多,,但它的數(shù)據(jù)交換量卻很少,。所以我們將發(fā)現(xiàn)它在一般情況下將快于冒泡排序。

堆排序:由于它在直接選擇排序的基礎(chǔ)上利用了比較結(jié)果形成,。效率提高很大,。它完成排序的總比較次數(shù)為O(nlog2n)。它是對數(shù)據(jù)的有序性不敏感的一種算法。但堆排序?qū)⑿枰鰞蓚€步驟:-是建堆,,二是排序(調(diào)整堆),。所以一般在小規(guī)模的序列中不合適,但對于較大的序列,,將表現(xiàn)出優(yōu)越的性能,。

直接插入排序:簡單的插入排序,每次比較后最多移掉一個逆序,,因此與冒泡排序的效率相同,。但它在速度上還是要高點,這是因為在冒泡排序下是進(jìn)行值交換,,而在插入排序下是值移動,,所以直接插入排序?qū)⒁獌?yōu)于冒泡排序。直接插入法也是一種對數(shù)據(jù)的有序性非常敏感的一種算法,。在有序情況下只需要經(jīng)過n-1次比較,,在最壞情況下,將需要n(n-1)/2次比較,。

希爾排序:增量的選擇將影響希爾排序的效率,。但是無論怎樣選擇增量,最后一定要使增量為1,,進(jìn)行一次直接插入排序,。但它相對于直接插入排序,由于在子表中每進(jìn)行一次比較,,就可能移去整個經(jīng)性表中的多個逆序,,從而改善了整個排序性能。希爾排序算是一種基于插入排序的算法,,所以對數(shù)據(jù)有序敏感,。

歸并排序:歸并排序是一種非就地排序,將需要與待排序序列一樣多的輔助空間,。在使用它對兩個己有序的序列歸并,,將有無比的優(yōu)勢。其時間復(fù)雜度無論是在最好情況下還是在最壞情況下均是O(nlog2n),。對數(shù)據(jù)的有序性不敏感,。若數(shù)據(jù)節(jié)點數(shù)據(jù)量大,那將不適合,。但可改造成索引操作,,效果將非常出色。

基數(shù)排序:在程序中采用的是以數(shù)值的十進(jìn)制位分解,,然后對空間采用一次性分配,,因此它需要較多的輔助空間(10*n+10), (但我們可以進(jìn)行其它分解,如以一個字節(jié)分解,空間采用鏈表將只需輔助空間n+256),?;鶖?shù)排序的時間是線性的(即O(n))。由此可見,,基數(shù)排序非常吸引人,,但它也不是就地排序,若節(jié)點數(shù)據(jù)量大時宜改為索引排序,。但基數(shù)排序有個前提,,要關(guān)鍵字能象整型、字符串這樣能分解,,若是浮點型那就不行了,。

按平均時間將排序分為類:
(1) 平方階(O(n2))排序
  各類簡單排序,例如直接插入,、直接選擇和冒泡排序,;
(2) 線性對數(shù)階(O(nlog2n))排序
  如快速排序,、堆排序歸并排序,;
(3) O(n1+§))排序
  §是介于0和1之間的常數(shù)。希爾排序便是一種,;
(4) 線性階(O(n))排序
  本程序中的基數(shù)排序,,此外還有桶、箱排序,。


排序方法的選擇

因為不同的排序方法適應(yīng)不同的應(yīng)用環(huán)境和要求,,所以選擇合適的排序方法很重要
(1)
n較小,可采用直接插入或直接選擇排序,。
當(dāng)記錄規(guī)模較小時,,直接插入排序較好,它會比選擇更少的比較次數(shù),;

但當(dāng)記錄規(guī)模較大時,,因為直接選擇移動的記錄數(shù)少于直接插人,所以宜用選直接選擇排序,。
這兩種都是穩(wěn)定排序算法,。
(2)若文件初始狀態(tài)基本有序(指正序),則應(yīng)選用直接插人,、冒泡或隨機的快速排序為宜(這里的隨機是指基準(zhǔn)取值的隨機,,原因見上的快速排序分析);這里快速排序算法將不穩(wěn)定,。

(3)
n較大,,則應(yīng)采用時間復(fù)雜度為O(nlog2n)的排序方法:快速排序、堆排序或歸并排序序。
快速排序是目前基于比較的內(nèi)部排序中被認(rèn)為是最好的方法,,當(dāng)待排序的關(guān)鍵字是隨機分布時,,快速排序的平均時間最短;
堆排序雖不會出現(xiàn)快速排序可能出現(xiàn)的最壞情況,。但它需要建堆的過程,。這兩種排序都是不穩(wěn)定的。
 
歸并排序是穩(wěn)定的排序算法,,但它有一定數(shù)量的數(shù)據(jù)移動,,所以我們可能過與插入排序組合,先獲得一定長度的序列,,然后再合并,,在效率上將有所提高。
(4)特殊的箱排序,、基數(shù)排序

它們都是一種穩(wěn)定的排序算法,,但有一定的局限性:
  1、關(guān)鍵字可分解,。

  2
,、記錄的關(guān)鍵字位數(shù)較少,如果密集更好
  3,、如果是數(shù)字時,,最好是無符號的,否則將增加相應(yīng)的映射復(fù)雜度,,可先將其正負(fù)分開排序,。


    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多