排序中的快速排序

思想:
通過一個數組劃分成兩個子數組,然後通過遞歸調用把每個數組進行再分,直到排序完成。
劃分:通過在數組中找到一個關鍵字,進行劃分 小的都在左邊,大的都在右邊,
1)、設置兩個變量I、J,排序開始的時候I:=1,J:=N;
2)以第一個數組元素作爲關鍵數據,賦值給X,即X:=A[1];
3)、從J開始向前搜索,即由後開始向前搜索(J:=J-1),找到第一個小於X的值,兩者交換;
4)、從I開始向後搜索,即由前開始向後搜索(I:=I+1),找到第一個大於X的值,兩者交換;
5)、重複第3、4步,直到I=J;
這裏寫圖片描述
程序執行過程數字變化是這樣的
49 38 65 97 76 13 27
第一個數字以49爲key
先從最右邊找比49小的 27符合 因爲左邊第一個就是49 49=49 所以在49這裏卡住了 等着右邊來換 所以 array[start]=array[end]; 變成了
27 38 65 97 76 13 27
這時候右邊找比49小的 27並沒有賦值 等着左邊找到一個比49大的轉換位置 找到65 然後 array[end]=array[start]; 所以數字順序變成了
27 38 65 97 76 13 65
以此類推 左邊賦完值 左邊這個就比49大 所以卡住了 然後在右邊找比49小的值 找到13 array[start]=array[end]; 變成了
27 38 13 97 76 13 65
然後 右邊卡住 再從左邊找 變成了 27 38 13 97 76 97 65
然後 左邊卡住 再從右邊找比49小的 沒有找到 start=3 end=3
然後再把key值賦值給arr[end] 所以第一次排序完順序是 27 38 13 49 76 97 65
再進行遞歸….

public class sort {
public static void main(String[] args) {
    int[] arr = new int[]{44,55,11,22,14,78};
    sort(arr,0,arr.length-1);
    for(int i=0;i<arr.length;i++){
        System.out.print(arr[i]+"  ");
    }
}

public static void sort(int[] array,int start ,int end){
    if(start>=end){
        return ;
    }
    int index=partition(array,start,end);
    sort(array,start,index-1);
    sort(array,index+1,end); 
    //通過遞歸調用
}
public static int partition(int []array,int start ,int end){
    //固定的切分方式
    int key=array[start];
    while(start<end){
        while(array[end]>=key&&end>start){//從後半部分向前掃描
            end--;
        }
        array[start]=array[end];
        while(array[start]<=key&&end>start){//從前半部分向後掃描
            start++;
        }
        array[end]=array[start];
        //別以爲這裏錯了  其實這裏面都有兩個一樣的數字 每次的key值都被別的替代了  等到後面會把最後key應該待的地方賦值成key的值 (因爲每次轉換地方太麻煩了
    }
    array[end]=key;
    return end;
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章