重新讀算法這本書,把代碼寫一下,做好博客
排序算法類模板
public class Example {
public static void sort(Comparable[] a){
}
private static boolean less(Comparable v, Comparable w){
return v.compareTo(w) < 0;
}
private static void exch(Comparable[] a, int i, int j){
Comparable t = a[i];
a[i] = a[j];
a[j] = t;
}
private static void show(Comparable[] a){
for (int i=0; i<a.length; i++){
System.out.print(a[i] + " ");
}
System.out.println();
}
public static boolean isSorted(Comparable[] a){
for (int i=1; i<a.length; i++){
if (less(a[i], a[i-1])){
return false;
}
}
return true;
}
public static void main(String[] args) {
int N = 10;
Integer[] a = new Integer[N];
for (int i=0; i<N; i++){
a[i] = (int)(Math.random()*100);
}
sort(a);
assert isSorted(a);
show(a);
}
}
2.1.2 選擇排序
// 2.1.2 選擇排序
// 一種最簡單的排序算法是這樣的:首先,找到數組中最小的那個元素,
// 其次將它和數組的第一個元素交換位置(如果第一個元素就是最小元素那麼它就和它自己交換)。
// 再次,在剩下的元素中找到最小的元素,將它與數組的第二個元素交換位置。如此往復,直到將整個數組排序。
// 這種方法叫做選擇排序,因爲它在不斷選擇剩餘元素之中的最小者。
//
//結論:不管數組初始狀態怎樣所需時間都是一樣的
//
//2017年8月3日20:46:24
public class Selection{
public static void sort(Comparable[] a){
//按數組升序排列
int N = a.length;
for (int i=0; i<N; i++){
int min = i; //最小數組的索引
for (int j=i+1; j<N; j++){
if (less(a[j], a[min])){
min = j;
}
}
exch(a, i, min);
}
}
// less() exch() isSorted()和main() 方法見“排序算法類模板”
}
2.1.3 插入排序
// 2.1.3 插入排序
// 通常人們整理橋牌的方法是一張一張的來,將每一張牌插入到其他已經有序的牌中的適當位置。
// 在計算機的實現中,爲了給要插入的元素騰出空間,我們需要將其餘所有元素在插入之前都向右移動以爲。
// 這種算法叫做插入排序
//
//下面是幾種典型的部分有序的數組:
// 1.數組中的每個元素距離它的最終位置都不遠
// 2.一個有序的大數組接一個小數組
// 3.時更要注意中只有幾個元素的位置不正確
//插入排序對這樣的數組很有效,而選擇排序不然。
//事實上,當倒置的數量很少時,插入排序很可能比本章中的其他任何算法要快。
//
//2017年8月3日21:21:48
public class Insertion{
public static void sort(Comparable[] a){
//按數組升序排列
int N = a.length;
for (int i=1; i<N; i++){
// 將a[i]插入到a[i-1]、a[i-2]、a[i-3]...之中
for (int j=i; j>0 && less(a[j], a[j-1]); j--){
exch(a, j, j-1);
}
}
}
// less() exch() isSorted()和main() 方法見“排序算法類模板”
}
2.1.6 希爾排序
// 2.1.6 插入排序
// 希爾排序的思想是使數組中任意間隔爲h的元素都是有序的。
// 這樣的數組被稱爲h有序數組。換句話說,一個h有序數組就是h個互相獨立的有序數組編織在一起組成的一個數組。
// 在進行排序時,如果h很大,我們就能將元素移動到很遠的地方,爲實現更小的h有序創造方便。
// 用這種方式,對於任意以1結尾的h序列,我們都能夠將數組排序。這就是希爾排序
//
// 算法2.3的實現使用了1/2(3的k次方-1),從N/3開始遞減至1.我們把這個序列稱爲遞增序列
//
//2017年8月3日22:50:47
public class Shell{
public static void sort(Comparable[] a){
//按數組升序排列
int N = a.length;
int h = 1;
while (h < N/3){
h = 3*h + 1;
}
while (h >= 1){
//將數組變爲h有序
for (int i=h; i<N; i++){
//將a[i]插入到a[i-h]、a[i-h]、a[i-h]...之中
for (int j=i; j>=h && less(a[j], a[j-h]); j-=h){
exch(a, j, j-h);
}
}
h /= 3;
}
}
// less() exch() isSorted()和main() 方法見“排序算法類模板”
}