算法(2.1 初級排序)

重新讀算法這本書,把代碼寫一下,做好博客


排序算法類模板

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()    方法見“排序算法類模板”
}

發佈了29 篇原創文章 · 獲贊 0 · 訪問量 4537
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章