1. 程式人生 > >關於冒泡、快排、二分排序演算法分析

關於冒泡、快排、二分排序演算法分析

前面的話:

把自己總結的排序方法分享一下,也當作自己的筆記本了
冒泡: 氣泡排序演算法的主要思想是每次只比較相鄰的兩個元素,一輪排序之後,最大的元素就會沉到最下面(全文預設升序),然後每次迴圈比較,就可以得到一個已排序好的陣列。

程式碼實現:
public static void main(String[] args) {
	int[] num = {8,20,1,3,9,5,41,10,11,2};
	//氣泡排序
	for (int i = 0; i < num.length-1; i++) {  //控制比較輪次
		for (int j = 0; j < num.length-i-1; j++) {  //控制每輪中各個元素的比較次數
			if (num[j]>num[j+1]) {   //升序
				int temp = num[j+1];
				num[j+1] = num[j];
				num[j] = temp;
			}
		}
	}
	Out(num);
	
}


//輸出陣列中元素
public static void Out(int[] arrs) {
	for (int i = 0; i < arrs.length; i++) {
		System.out.println(arrs[i]);
	}
}

經過這樣的排序之後,陣列就有序了!其中內迴圈為什麼要寫 num.length-i-1 呢? 因為經過一輪迴圈之後,最大的元素就會沉到最下面,所以在後面比較的時候就不需要再參與比較了。num[j]>num[j+1] 這個是隻比較兩個相鄰的元素。
快速排序: 快速排序算是氣泡排序的改進演算法,有很多方法可以實現,我這裡用了最經典的 挖坑法 來解決問題,直接上程式碼。

程式碼實現:
static void sort(int[] a,int low,int high){
	
    int start = low;
    int end = high;
    int key = a[low];
    
    while(end>start){
        //從後往前比較
        while(end>start&&a[end]>=key)  //如果沒有比關鍵值小的,比較下一個,直到有比關鍵值小的交換位置,然後又從前往後比較
            end--;
        if(a[end]<=key){
            int temp = a[end];
            a[end] = a[start];
            a[start] = temp;
        }
        //從前往後比較
        while(end>start&&a[start]<=key)//如果沒有比關鍵值大的,比較下一個,直到有比關鍵值大的交換位置
           start++;
        if(a[start]>=key){
            int temp = a[start];
            a[start] = a[end];
            a[end] = temp;
        }
    //此時第一次迴圈比較結束,關鍵值的位置已經確定了。左邊的值都比關鍵值小,右邊的值都比關鍵值大,但是兩邊的順序還有可能是不一樣的,進行下面的遞迴呼叫
    }
    //遞迴比較後面的資料
    //現在陣列右邊的都是比第一輪哨兵小的資料
    //陣列左邊的資料都是比第一輪哨兵大的資料
    //兩邊資料中不是有序的,所以後面要遞迴排序
    if(start>low) sort(a,low,start-1);//左邊序列。第一個索引位置到關鍵值索引-1
    if(end<high) sort(a,end+1,high);//右邊序列。從關鍵值索引+1到最後一個
}
public static void main(String[] args) {
	int[] num = {80,16,100,35,85,20,12,90,110,5};
	 sort(num, 0, num.length-1);
	//out
	for (int i = 0; i < num.length; i++) {
		System.out.print(num[i] + " ");
	}
}

可能大家看的雲裡霧裡的,下面附上小編準備的一張手寫步驟紙:
在這裡插入圖片描述
自己親手將快排的第一輪的排序過程寫了出來,還算清晰,其中,在每輪排序的時候都會設定一個哨兵(key) 來和後面的資料進行比較,比較的順序是 左右交替 進行比較。