天天看點

一個關于快排的問題

做1306的sorting algorithm的時候
一開始寫的快排逾時了
然後用ilovenwd師兄提供了下面的快排才過了


你快排寫得不好.
試試一組 1000000 個0的資料.
參考一下下面這個

  
   
    
        
一個關于快排的問題
一個關于快排的問題
void quick_sort(int *a,int n) ...{
一個關于快排的問題
        int i=0, j=n-1;
一個關于快排的問題
        int x=a[n/2];
一個關于快排的問題
一個關于快排的問題
        while(i<=j) ...{
一個關于快排的問題
                while(a[i]<x) i++; //注意<不是<=
一個關于快排的問題
                while(a[j]>x) j--;
一個關于快排的問題
                if(i<=j) swap(a[i],a[j]), ++i, --j;
一個關于快排的問題
        }
一個關于快排的問題
        if(j>0) quick_sort(a,j+1);
一個關于快排的問題
        if(i<n-1) quick_sort(a+i, n-i);
一個關于快排的問題
} 關鍵的不是左邊或間. 而是 那個<和<=的差別. 你去看一些比較好的算法書.比如Robert Sedgewick那本.有詳細分析. 如果你覺得取中間有可能O(n^2)就一開始就随機Shuffle一下.不過基本沒必要. ===============
一個關于快排的問題
void sort(int l,int r) 
一個關于快排的問題
一個關于快排的問題
...{ 
一個關于快排的問題
        int i,j,x,t; 
一個關于快排的問題
        i=l;j=r;x=a[(l+r)/2]; 
一個關于快排的問題
一個關于快排的問題
        do ...{
一個關于快排的問題
        while ((a[i]<x)&&(i<r)) i++; 
一個關于快排的問題
        while ((a[j]>x)&&(j>l)) j--; 
一個關于快排的問題
一個關于快排的問題
        if (i<=j) ...{t=a[i];a[i]=a[j];a[j]=t;i++;j--;} 
一個關于快排的問題
        } while (i<=j) ; 
一個關于快排的問題
        if(l<j) sort(l,j); 
一個關于快排的問題
        if(r>i) sort(i,r); 
一個關于快排的問題
}

繼續閱讀