快速排序法兩種代碼實現方式講解

快速排序法的原理我就不多講了,就是基於分冶的思想,所以一般用遞歸調用實現。至於具體原理網上一搜一大把,而我要講的就是代碼實現中具體代碼部分的講解。首先看第一種實現方式:

//快速排序第一種方式實現
void quick_sort(int s[], int l, int r)  
{  
    if (l < r)  
    {  
        //Swap(s[l], s[(l + r) / 2]); //將中間的這個數和第一個數交換 參見注1  
        int i = l, j = r, x = s[l];  
        while (i < j)  
        {  
            while(i < j && s[j] >= x) // 從右向左找第一個小於x的數  
                j--;    
            if(i < j)   
                s[i++] = s[j];  

            while(i < j && s[i] < x) // 從左向右找第一個大於等於x的數  
                i++;    
            if(i < j)   
                s[j--] = s[i];  
        }  
        s[i] = x;  
        quick_sort(s, l, i - 1); // 遞歸調用   
        quick_sort(s, i + 1, r);  
    }  
}  

其實這種方法,在網上是講的最多的,而且很詳細,就是從兩端開始。i,j分別與比較量(一般是首個數或者中間量)進行比較,比它小的替換掉放一邊,比它大的放另外一邊。最後再把比較量放到分割位置。

在這裏我着重講第二種代碼實現方式:

//快速排序第二種實現方式
void qsort(int v[],int left,int right)
{
    int i, last;
    void swap(int v[],int i,int j);//交換兩個數

    if(left >= right)
        return;
    swap(v,left,(left+right)/2);//將中間數交換,防止第一個數就是最小或者最大,減小複雜度
    last=left;//第一個數爲比較量
    for(i=left+1;i<=right;i++)
        if(v[i]<v[left])
            swap(v,++last,i);

    swap(v,left,last);
    qsort(v,left,last-1);
    qsort(v,last+1,right);
}

可以發現,這種代碼實現方式比第一種簡潔的很多,但是不夠直觀,關鍵代碼如下:

    last=left;//第一個數爲比較量
    for(i=left+1;i<=right;i++)
        if(v[i]<v[left])
            swap(v,++last,i);

    swap(v,left,last);

第二種方式的實現是從一端開始的,我們可以這麼想,比較量是第一個,即v[left]。後面的數v[i]都和它進行比較,i是個移動量,而last是一個在數組中做標記的,在標記的數後面的數都是比v[left]小的數,
每當v[i]小於v[left],last應該先+1,因爲它自身是滿足小於v[left],所以需要將前面不滿足的數替換掉,然後自己又指向了這個新的數,i也往後移一位。最後再將這個分割量v[left]交換到分割位置last。

這是對第二種實現方式代碼圖解方式[(http://www.cnblogs.com/kaituorensheng/archive/2013/02/23/2923771.html)]

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