第7 章 排序

章 排序

不能在主存中完成而必須在磁盤或磁帶上完成的排序叫做外部排序

目標(內部排序)

1. 存在幾種容易的算法以 ON2)完成排序

2. 有一種算法叫做希爾排序,它編程非常簡單,以 ON2)運行,並在實踐中很有效

3. 存在一些稍微複雜的0N log N)的排序算法

4. 任何通用的排序算法均需要Ω(N log N)此比較

 

7.1 預備知識

正如1.4 節所描述,被排序的對象屬於Comparable類型,因此我們使用CompareTp方法對輸入數據施加相容排序,除引用賦值運算外,這是僅有的允許對輸入數據進行的操作,在這些條件下的排序叫做基於比較的排序

 

7.2 插入排序

7.2.1 算法

最簡單的排序算法之一是 插入排序 插入排序由N1趟排序組成,對於P=1N - 1,插入排序保證了從位置0p-1的位置已處於排序狀態

P趟我們將位置P上的元素向左移動,知道它在前P+1個元素中找到正確的位置

 

 

 

 

 

 

 

 

 

 

藍色字體實現數據移動而沒有明顯的使用交換,位置在P上的元素存儲於tmp中而(在位置p之前)所有的更大的元素都被向右移動一個位置,然後tmp被置於正確位置

7.2.2 插入排序分析

由於嵌套循環的每一次都要執行N此迭代,因此插入排序爲ON2,而且這個界是精確的,因此每次以反序的輸入可以達到該界

另一方面如果數據一斤排序那麼運行時間爲0N

7.3 一些簡單排序算法的下屆

逆序:數組中 i < j  a[i] > a[j] 的性質的元素稱爲逆序

可以通過計算排列中的平均逆序樹得出排序平均運行時間的精確的界

N個互異樹的數組平均逆序樹是 NN-1/4

 

7.4 希爾排序(插入排序的一種)

該算法是衝破二次時間屏障的第一批算法之一,不過,諾幹年後才被證明它的二次時間界

它通過比較相距一定間隔的元素來工作,各趟比較所用的距離隨着算法的進行而減小,直到比較相鄰兩項爲止。由於這個原因,希爾排序有時也叫作縮減增量排序

 

希爾排序使用一個序列,h1 ,h2 ,...,ht 叫作增量系列,在使用hk排序後,對於每一個i我們都有a[i] <= a[i+k},此時所有想個K的元素都別排序了,此時稱爲文件的hk排序

 

希爾排序是基於插入排序的以下兩點性質而提出改進方法的

1. 插入排序在對幾乎已經排好序的數據操作時,效率高,即可以達到線性排序的效率。

2. 但插入排序一般來說是低效的,因爲插入排序每次只能將數據移動一位。

使用希爾排序最壞情景運算時間爲ON2

 

 

 

 

 

 

 

 

 

 

 

使用Hibbard增量的希爾排序最壞時間複雜度爲ON3/2

Hibbard 增量 形如 137, ....,2K-1   

7.5堆排序

優先隊列可以使用ON log N)的時間排序,基本思想的算法叫做堆排序,他給出我們至今所見到的最佳的大O運行時間

1.建立N個元素的二叉堆的,這個階段花費ON)時間,最多用到2N次比較

2.然後我們執行NdeleteMin操作,按照規則最小的元素先離開隊列,通過把這些元素記錄在第二個數組 這階段花費Olog N) 最多用到2N logN -O(N)次比較、

因此總運行時間爲ON log N) 最多用到2N logN -O(N)次比較、

該算法需要多增加一倍的空間

 

7.6 歸併排序

歸併排序以O(Nlog N)最壞時間運行,而使得使用的比較次數是最優的,它是遞歸算法的好實例

該算法的基本操作時合併兩個已排序的表,因爲兩個表時已排序的,所以將輸出放到第三個表中。則該算法可以通過對輸入數據一趟排序來完成。基本的合併算法是去兩個輸入數組AB,一個輸入數組C,以及3個計數器

分治策略 它將問題分成一些小問題然後遞歸求解

7.7 快速排序

快速排序是實踐中的一種快速排序算法,它的平均運行時間爲O(Nlog N) 最壞運行時間爲0N2)但是經過努力這種情況就很難出現 該算法之所以塊是因爲 非常精煉和高度優化的內部循環。

快排的效率一般還是不錯的,事實上,如果表中含有大量的重複項,以及相對較少的不同項,其表現還是不錯的

該算法會參數額外的空間,因此我們必須避免使用大量額外的內存,應該避免建立第二組(包含等於項的) 細節會影響排序效率

7.7.3 小數組

對於很小的數組,快速排序不如插入排序(N < 20

7.8 排序算法的一般下屆

雖然我們得到了一些ONlog N)的排序算法,但是,尚不清楚我們是否還能做更好。我們證明,任何只用到比較排序算法的最壞情況都需要Ω(N log N)此比較,因此歸併排序和堆排序在一個常數因子範圍內都是最優秀的。這也意味着拍數排序在相差一個常數因子的時候時最優秀的

只用到比較的任何排序算法在最壞情況下都需要(log(N!))此比較

 

策略樹 (二叉樹)

策略樹是證明下屆的抽象概念,給個節點表示在元素之間一組可能的排序,每一個節點之間一組可能的排序。

 

7.9 選擇問題的決策樹下屆

任意基於比較排序算法都必須用到大約N log N此比較,

7.11 線性時間的排序 桶排序和基數排序

在某一些特殊情況下以線性時間進行排序任然是可能的 ,一個簡單的例子是桶排序

桶排序 : 使用大小爲M(元素小於M)的稱爲count的數組,初始化全部爲0於是count有了M個單元(或稱爲桶),初始化爲空,當讀入Aicount增加一,在所有內容都別輸入後,掃描數組。該算法的用時OM+N,如果MO(N),那麼總用時就是ON

適用於一些小整數的情況

基數排序 一般的 對某常數考慮值域從0 ~ bp 的數字,顯然不能使用桶排序,竅門是使用多次桶排序。自然的算法是對最高位的數字用桶排序,在對此高位排序。。。。

 

7.12 外部排序

迄今爲止我們考察的算法都是輸入數據裝入內存,然而存在一些應用,他們輸入的數據量太大了,裝不進內存。本節將談論這些外部排序算法,他們是設計來處理很大的數據的

如果數據在硬盤上,由於磁盤轉動和移動磁頭所需要的時間,會使效率損失

 

7.12.3 簡單算法

基本的外部排序算法使用歸併排序中的合併算法

外部排序指的是大文件的排序,即待排序的記錄存儲在外存儲器上,待排序的文件無法一次裝入內存,需要在內存和外部存儲器之間進行多次數據交換,以達到排序整個文件的目的

 

小結

對於大部分一般的內部排序的運用都是 插入排序,希爾排序,歸併排序就是快速排序,這主要是底層環境來決定的。

插入排序使用於非常少量是輸入

對於中等附魔的輸入 希爾排序是一個不錯的選擇,它可以用少了代碼就能給出優異的表現

歸併排序在最壞情況下變現OlogN),但需要額外的空間然而,它用到的比較次數幾乎是最優的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章