1. 程式人生 > >演算法之排序

演算法之排序

假定,你要為你的生日聚會邀請你的朋友和親戚。對此,你需要給他們打電話。你正在擁有10,000條記錄的電話本中查詢名為Steve的電話號碼。然而,電話本中的記錄是以隨意順序儲存的。要在這樣一個目錄中查詢你朋友的電話號碼,你需要按順序在目錄中瀏覽每個條目。這將非常耗時,你如何解決此問題呢?
    

節省時間和高效搜尋資料的簡單解決方案是排序。
排序是按照某些預定義的順序或序列排列資料的過程。此順序可以是升序或降序。
如果資料被排序,則可以直接轉到儲存以‘S’開頭的姓名部分,因此減少了要遍歷的記錄數。

選擇排序演算法

通過使用一演算法實現在程式中排序。
一些排序演算法有:
冒泡(Bubble)排序
選擇排序
插入排序
殼(Shell)排序
合併排序
快速排序
堆排序
要選擇合適的演算法,你需要考慮以下方面:
執行時間
儲存空間
程式設計工作

氣泡排序演算法:
是最簡單的排序演算法之一
此演算法具有二次方程增長階,因此適合僅排序小列表
通過列表重複掃描、比較相鄰元素和按錯誤順序交換,此演算法會有作用.

編寫一演算法以實現氣泡排序。
氣泡排序的演算法是:
1.設定通道(圈數) = 1。
2.重複步驟3  區分0到n – 1通道中的j。
1.如果索引j處的元素大於索引j + 1處的元素,則交換這兩個元素。
3.按1遞增通道;圈數加1
4.如果通道 <= n-1,則轉到第2步。

排序演算法的效率按照比較次數來測量。
在氣泡排序中,通道1內有n– 1 次比較,通道2中有n– 2次比較,依此類推。
比較總數= (n – 1) + (n – 2) + (n – 3) + … + 3 + 2 + 1= n(n– 1)/2。
n(n – 1)/2是O(n2)階的級數。因此,氣泡排序演算法是階O(n2)的演算法。

什麼是氣泡排序演算法的增長階?
答案:
n – 1 次比較

答案:
氣泡排序演算法具有二次方增長階

當實現氣泡排序演算法時,在通道1中將執行多少次比較?
答案:
n –1次比較

使用選擇排序來排序資料

選擇排序演算法:
選擇排序還具有二次方程增長階,且因此僅適用於排序小的列表。
選擇排序通過列表反覆掃描,每次掃描選擇一項,然後將這一項移動到列表中正確的位置。

要理解選擇排序演算法的實現,考慮陣列中儲存的未排序的數字列表。每次都尋找最小值,將最小值往前放

編寫一演算法以實現選擇排序。
選擇排序的演算法:
1.重複步驟2和3區分0到n -2通道中的j
2.找出arr[j]到arr[n– 1]中的最小值:
a.設定min_index = j
b.重複步驟c區分j + 1到n – 1的i
c.如果arr[i] < arr[min_index]:
  i.   min_index = i
3.將arr[j]與arr[min_index]交換

在選擇排序中,在查詢最小元素的通道1中有n– 1次比較。在查詢第二個最小元素的通道2中有n -2次比較,依此類推。
比較總數 = (n – 1) + (n – 2) + (n – 3) + … + 3 + 2 + 1 =n(n– 1)/2
n(n – 1)/2是O(n2)階的級數。因此,選擇排序演算法是階O(n2)的演算法。

插入排序演算法:
具有二次方程增長階,且因此僅用於排序小列表。
如果需要排序的列表幾乎已經排序,則插入排序比氣泡排序和選擇排序更有效率。

要理解插入排序演算法的實現,考慮陣列中儲存的未排序的數字列表。

要使用插入排序演算法排序此列表:
你需要將列表分為兩個子列表,即排序和未排序。

若要通過使用插入排序排序大小為n的列表,您需要執行(n– 1) 次通道。
最佳用例效率:
當列表已經被排序時產生最佳用例。
在這種情況下,您必須在每個通道中僅做一次比較。
在n– 1次通道中,您將需要做n– 1次比較。
插入排序的最佳用例效率是O(n)階的。
最糟用例效率:
當列表按反向順序排序時產生最糟用例效率。
在這種情況下,您需要在第1個通道中做1次比較,在第二個通道中做2次比較,在第3個通道中做3次比較,在第n– 1 個通道中做n – 1次比較。
插入排序的最糟用例效率是O(n2)階的。

銷售經理對2004-2006念市場上最佳冷飲銷售員進行調查。David是一名軟體開發人員,他有一個冷飲品牌及其銷售資料的檔案。 David 必須向銷售經理提供排序好的資料。檔案總的資料或多或少都要進行排序。儲存此資料最有效率的排序演算法是哪個?為什麼?
記錄是以隨意順序儲存的。    

答案:
當列表部分排序時,插入排序提供了比泡泡排序和選擇排序更好的有效。因此David應使用插入排序演算法。

殼排序演算法:
只要此列表已經部分排序且造成平均用例中的無效解決方案,則插入演算法是高效演算法。
為了克服此限制,電腦科學家D.L. Shell提議改進插入排序演算法。
新的演算法稱為殼(Shell)排序,是按照他的姓名命名的。

殼排序:
通過按若干位置的距離形成多個子列表分隔元素並進行比較來改進插入排序演算法
對每個子列表應用插入排序使元素朝著其正確的位置移動
幫助元素快速靠近正確的位置,因此減少了比較的次數

小結

在本章中,你已經學到:
排序是按照某些預定義的順序或關鍵值排列資料的過程。此順序可以是升序或降序。
用於排序資料有各種排序演算法。其中一些如下:
氣泡排序
選擇排序
插入排序
殼排序
合併排序
快速排序
堆排序

若要選擇合適的演算法,您需要考慮以下內容:
執行時間
儲存空間
程式設計工作
氣泡排序和選擇排序演算法具有二次方程增長階,且因此僅適用於排序小的列表。
插入排序執行不同次數的比較,這取決於最初的元素分階。當元素已經處於排序階,則插入排序需要進行極少比較。
如果需要排序的列表幾乎已經排序,則插入排序比氣泡排序和選擇排序更有效率。

通過比較按若干位置的距離分隔的元素,殼排序改善了插入排序。這幫助元素快速靠近正確的位置,因此減少了比較的次數。