下一章下面的**基本都是使用comparable 介面,使用這個介面實現了主鍵的抽象,它給出了實現這個介面資料型別的物件的大小順序的定義。
但是,不是每次都要使用這個介面,因為陣列元素的主鍵很可能只是每個元素的一小部分
概念:首先找到陣列中最小的元素,其次,將它和陣列的第乙個元素交換位置(如果第乙個元素就是最小元素那麼它就和自己交換)。其次,在剩下的元素中找到最小的元素,將它和陣列的第二個元素交換位置。如此往復,知道將整個陣列排序。
在這個演算法中,最重要的就是交換和比較,,所有演算法的時間效率取決於比較的次數
對於選擇排序,鮮明的特點就是 執行時間和輸入無關。
public
static
void
sort
(comparable[
] a)
exch
(a,i,min);}
}
插入排序就是你將每一張牌插入到已經有序的牌中的適當位置
但是在將其餘所有元素在插入之前都向右移動一位
與上面的選擇排序 不同的是, 插入排序所需的時間取決於輸入元素中元素的初始順序
所以通過上述的得到:插入排序對應非隨機數組的排序,效率會更好
public
static
void
sort
(comparable[
] a)
}}
要大幅度提高插入排序的速度 的方法: 只需要在內迴圈中將較大的元素都向右移動而不總是交換兩個元素(這樣訪問陣列的次數就能減少一半)
public
static
void
sort2
(comparable[
] a)
a[j]
= temp;
}}
希爾排序是==基於插入排序==的快速的排序演算法
希爾排序為了加快速度簡單的地改進了插入排序,交換不相鄰的元素以對陣列的區域性進行排序,並最終用插入排序將區域性有序的陣列排序
相當於分組排序
public
static
void
sort
(comparable[
] a)
while
(h >=3)
h = h/3;}}}
歸併排序 : 可以先將它分成兩半分別排序,然後再將結果歸併起來,
當然最吸引人的地方是 : 它能夠保證將任意長度為n的陣列排序所需時間和
成正比,
主要缺點是: 它所需的額外空間和n成正比
歸併排序分為自頂向下和自底向上的兩種方法,
在歸併排序中利用了高效演算法中的分治思想,,,這是其中最典型的例子
//自頂向下
class
merge
private
static
void
sort
(comparable[
] a,
int lo,
int hi)
int mid = lo +
(hi - lo)/2
;sort
(a, lo, mid)
;sort
(a, mid +
1, hi)
;merge1
(a, lo, mid, hi);}
public
static
void
merge1
(comparable[
] a,
int lo,
int mid,
int hi)
for(
int k = lo; k <= hi; k++
)else
if(j > hi)
elseif(
less
(aux[j]
, aux[i]))}}}
//自底向上
class
mergebu}}
public
static
void
merge2
(comparable[
] a,
int lo,
int mid,
int hi)
for(
int k = lo; k <= hi; k++
)else
if(j > hi)
elseif(
less
(aux[j]
, aux[i]))}}}
上面這個兩個方法,,的臨界值是 當陣列長度為2的冪時,兩種歸併所用的比較次數和陣列訪問次數正好相同,只是順序不同,
而且自底向上的排序比較適合鍊錶組織的資料
基本排序演算法(2)
起泡排序 bubble sort 起泡排序是交換排序中最簡單的排序方法,其基本思想是 兩兩比較相鄰記錄的關鍵碼,如果反序則交換,直到沒有反序的記錄為止。將整個待排序記錄分為無序區和有序區,初始時有序區為空。對無序區從前到後依次將相鄰記錄的關鍵碼進行比較,若反序則交換,從而使得關鍵碼小的記錄向前移,關...
基本排序排序演算法
時空複雜度 氣泡排序 時間o n 2 額外空間o 1 插入排序 時間o n 2 額外空間o 1 選擇排序 時間o n 2 額外空間o 1 基數排序 時間o k n k logn max 額外空間o n 臨時儲存 o b 記數,b為基的大小 記數排序 時間o n k 額外空間o k 希爾排序 時間o ...
基本排序排序演算法
時空複雜度 氣泡排序 時間o n 2 額外空間o 1 插入排序 時間o n 2 額外空間o 1 選擇排序 時間o n 2 額外空間o 1 基數排序 時間o k n k logn max 額外空間o n 臨時儲存 o b 記數,b為基的大小 記數排序 時間o n k 額外空間o k 希爾排序 時間o ...