快速排序有點坑

先看代碼

//快排
    private int partition(int[] a,int start,int end){
        int key=a[start];
        int i=start,j=end;
        while(i<j){
            while (i<j && a[j]>=key) {j--;}//考慮2個數的時候的分區,先從右算
            while (i<j && a[i]<=key) {i++;}//最多隻能一邊和key相等時結束
            //交換 這裏i<=j
            int t=a[i];
            a[i]=a[j];
            a[j]=t;
        }
        //key置換
        a[start]=a[j];
        a[j]=key;
        return j;
    }

    public void quickSort(int[] a,int start,int end){
        if(start>=end)
            return;
        int mid=partition(a,start,end);
        //中間的不用算
        quickSort(a,start,mid-1);
        quickSort(a,mid+1,end);
    }

    public int[] quickSort(int[] a){
        quickSort(a,0,a.length-1);
        return a;
    }

寫代碼的時候要考慮要只有兩個元素的時候運行情況,比如[3,2]

如果以第一個爲參照key的話,i和j應該指向2,這樣的話,應該是j先進入循環,也就是從右向左找,找到比key小,即2.然後i也走到2.

如果先i進入循環,左向右,就錯了。

其次i,j位置的數和key相等的時候不用交換,最多一個相等,如果兩個相等交換,會進入死循環。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章