排序算法——快排思想


快速排序

1、思想

  快速排序將一個數組分成兩個數組,再對兩個數組獨立排序,是個遞歸算法。

  首先隨機選出一個切分元素temp(一般為這個數組的第一個元素),將小於temp的數放在temp的左邊,將大於temp的數放在temp的右邊。

  快排和堆排序很像,他們都是將一個數組分成兩個子數組,都屬於遞歸算法。但是不同之處在於:快排空間復雜度為o(1),而堆排為o(n),

快排是原地排序,只需要一個很小的輔助棧,時間復雜度為NlogN。

2、代碼實現(java)

public class Quick {
    
    public static void sort(int[] a,int lo,int hi) {
        if(hi<=lo) return;
        //切分
        int j = partition(a,lo,hi);
        sort(a,lo,j-1);
        sort(a,j+1,hi);
        
    }
    //a[j]就是那個切分元素,從數組的左端開始向右掃描直到找到一個大於等於它的元素
    //再從數組的右端開始向左掃描直到找到一個小於等於它的元素,將這兩個元素交換位置。
    public static int partition(int[] a,int lo,int hi) {
        //左右掃描數組
        int j = lo;
        int i = hi+1;;
        int v = a[lo];
        while(true) {
            while(v>=a[++j]){
                if(j==hi) break;
                //j++;
            }
            while(v<=a[--i]) {
                if(i==lo) break;
                //i--;
            }
            if(j>=i) {
                break;
            }
            int t = a[i];
            a[i] = a[j];
            a[j] = t;
        }
        a[lo] = a[j];
        a[j] = v;
        return j;
    }

    public static void main(String[] args) {
        int[] a = {49,78,23,34,67,45,73,90,120,12,20,9,5};
        int lo = 0;
        int hi = a.length-1;
        sort(a,lo,hi);
        for(int i=0;i<a.length;i++) {
            System.out.print(a[i]+" ");
        }

    }

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM