排序的基本概念(2
)排序演算法的效能評價
(a)評價排序演算法好壞的標準:
① 執行時間和所需的輔助空間
② 演算法本身的複雜程度
(b)排序演算法的空間複雜度
ø若排序演算法所需的輔助空間並不依賴於問題的規模n,即輔助空間是o(1),則稱之為就地排序。
ø非就地排序一般要求的輔助空間為o(n)。(c
)排序演算法的時間開銷
大多數排序演算法的時間開銷主要是關鍵字之間的比較和記錄的移動。有的排序演算法其執行時間不僅依賴於問題的規模,還取決於資料序列中資料的初始狀態(公升序、降序、隨機順序?)。
(d)排序演算法的基本操作
(a)比較兩個關鍵字大小(比較)
keys[i] ? keys[j]
(b)將記錄從乙個位置挪到另乙個位置(移動、交換)
private static void swap(int keys, int i, int j)
//交換keys[i]與keys[j]元素,i、j範圍由呼叫者控制
(3)排序演算法的穩定性(相同元素排序之後的順序)l當按照資料序列的主關鍵字進行排序時,排序結果是唯一的,否則排序結果不唯一。
在資料序列中,若存在多個關鍵字相同的記錄,經過排序後這些具有相同關鍵字的記錄之間的相對次序保持不變,該排序方法是穩定的。
l 若具有相同關鍵字的記錄之間的相對次序發生變化,則稱這種排序方法是不穩定的。
(4)內排序與外排序(與記憶體有關)
n在排序過程中,若整個資料序列都是放在記憶體中處理,即排序時不涉及資料的內、外存交換,則稱之為內部排序(簡稱內排序);
n反之,若排序過程中要進行資料的內、外存交換,則稱之為
外部排序(簡稱
外排序)。
注意:① 內排序適用於記錄個數不很多的小檔案
② 外排序則適用於記錄個數太多,不能一次將
其全部記錄放入記憶體的大檔案。
按排序所採用的策略對內排序分類
插入排序:直接插入排序、二分法 插入排序、希爾排序
交換排序:氣泡排序、快速排序
選擇排序:直接選擇排序、堆排序
歸併排序
基數排序
1 插入排序
2、直接插入排序演算法分析
(2)演算法的空間複雜度分析
演算法所需的輔助空間是乙個臨時變數temp,輔助空間複雜度s(n)=o(1)。是乙個就地排序。
(3)直接插入排序的穩定性
直接插入排序是穩定的排序方法。
3、二分法插入排序
直接插入排序是採用順序查詢尋找插入位置。
二分法插入排序是採用二分法查詢尋找插入位置。
1.2 希爾排序(shell sort)
若資料序列接近有序,則時間效率越高;
當n較小時,時間效率也較高。
2、希爾排序演算法分析
2 交換排序
2、氣泡排序演算法分析
(1)演算法的最好時間複雜度
若初始資料序列的初始狀態是公升序的,一趟掃瞄即可完成排序。所需的關鍵字比較次數c和記錄移動次數m均達到最小值:
cmin=n-1
mmin=0。
氣泡排序最好的時間複雜度為o(n)。
(2)演算法的最壞時間複雜度
若初始資料序列的初始狀態是降序的,需要進行n-1趟排序。每趟排序要進行n-i次關鍵字的比較(1≤i≤n-1),且每次比較都必須移動記錄3次來達到交換記錄位置。在這種情況下,比較和移動次數均達到最大值:
cmax=n(n-1)/2=o(n2)
mmax=3n(n-1)/2=o(n2)
氣泡排序的最壞時間複雜度為o(n2)。
資料序列的初始排列越接近公升序,氣泡排序效率越高。
雖然氣泡排序不一定要進行n-1趟,但由於它的記錄移動次數較多, 故平均時間效能比直接插入排序要差得多。
(4)演算法穩定性
氣泡排序是就地排序,且它是穩定的。
2、快速排序演算法分析
(4)空間複雜度
快速排序在系統內部需要乙個棧來實現遞 歸。若每次劃分較為均勻,則其遞迴樹的 高度為o(log2n),故需棧空間為 o(log2n) 。最壞情況下,遞迴樹的高度 為o(n),所需的棧空間為o(n)。
(5)穩定性
快速排序是非穩定的。
1 直接選擇排序(需要乙個元素來存待交換元素的值)
2、直接選擇排序演算法分析
(1)關鍵字比較次數
無論資料序列的初始狀態如何,在第i趟排序中選出最小關鍵字的記錄,需做n-i次比較,因此,總的比較次數為:
(2)記錄的移動次數
當資料序列的初始狀態為公升序時,移動次數為0當資料序列的初始狀態為降序時,每趟排序均要執行1次交換操作,總的移動次數取最大值3(n-1)。
直接選擇排序的平均時間複雜度為o(n2)。
(4)穩定性分析
4 歸併排序(乙個乙個分,然後再一對一對的合)
歸併:是指將若干個已排序的資料序列合併成乙個更大的有序資料序列。
二路歸併:將兩個已排序的資料序列合併成乙個更大的有序資料序列。
1、歸併排序演算法描述
一次歸併
2. 歸併排序演算法實現
void merge (int x, int y, int begin1, int begin2, int n) //一次歸併
void mergepass(int x, int y, int n)
//一趟歸併,子串行長度為n
void mergesort(int x) //歸併排序
3、歸併排序演算法分析
1、時間複雜度
對長度為n的資料序列,需進行
2、空間複雜度
需要乙個輔助陣列來暫存每趟歸併的結果,故其輔助空間複雜度為o(n),顯然它不是就地排序。
3、穩定性
歸併排序是一種穩定的排序。
總結--各種內排序方法的比較和選擇
3. 不同條件下,排序方法的選擇
(1)若n較小(如n≤50),可採用直接插入或直接選擇排序。
(2)若資料序列初始狀態基本呈現出公升序,則應選用直接插入、氣泡排序為宜;
(3)若n較大,則應採用時間複雜度為o(nlog2n)的排序方法:快速排序、歸併排序。
java資料結構 排序
資料的移動方式,可分為 直接移動 和 邏輯移動 兩種。直接移動改變兩個資料的位置,而邏輯移動,則是改變資料的指標。資料移動使用的記憶體 內部排序,排序的資料量小,可以完全在記憶體中進行。外部排序,排序的資料量無法直接在記憶體內進行排序,而必須使用輔助儲存器。排序演算法的選擇,通常由以下幾點決定 演算...
Java 資料結構 排序
思想 n 個元素需要排序 n 1 趟,每趟比較相鄰的兩個元素,如果前乙個元素和後乙個元素不滿足大小順序規則,則交換位置,這樣一趟下來,一趟中的最大 最小 的元素就 沉 到最後面的位置。執行 m 趟排序後,整個元素序列中的最後面的 m 個元素就排好順序了,剩下就只需要將前面的 n m 個元素排好序即可...
資料結構JAVA 氣泡排序
package com.function.demo 01 author of 2014年12月31日 資料結構 氣泡排序 演算法描述 公升序排列 從第乙個元素開始,對陣列中兩兩相鄰的元素比較,將值較小的元素放在前面,值較大的元素放在後面,一輪比較完畢,乙個最大的數沉底成為陣列中的最後乙個元素,一些較...