1. 程式人生 > >排序算法——快速排序

排序算法——快速排序

ron 再次 一個數 規模 color san 遞歸 oid urn

算法思想:

  分治+挖坑填數

  分治思想

    將原問題分解成若幹規模更小但是結構和原問題相同的子問題。遞歸求解子問題,然後解出原問題。

  快排算法思想

    ①選擇數組中第一個數作為基數,然後設置下標i=first,j=last

    ②(下標j–)從數組後面找出比第一個數小的數調換到前面

    ③然後(下標i++)從數組前面找出比基數大的數調換到後面

    ④如此循環②-③步,直到i=j

    結果為以基數分界,左邊的數比全部比基數小,右邊的數比基數大。結束這次排序。

    然後,下次分別排序[first,i-1]和[i+1,last]。這樣就將原問題劃分成兩個與原問題相同的子問題,再次對這兩個區間進行快速排序。


算法代碼實現:

//分治
void QuickSort(int a[],int first,int last)
{
    if(first < last)
    {
        int i = AdjustArray(a,first,last);//以基數分界,對基數左邊快排,對基數右邊快排
        QuickSort(a,first,i-1);
        QuickSort(a,i+1,last);
    }
}

//挖坑填數的代碼
int AdjustArray(int a[],int first,int last)
{
    int i = first,j = last;
    
int m = a[first];//以第一個數為基數 while(i<j) { while(i<j && a[j] >= m)//從後往前找小於基數的數 j--; if(i<j) { a[i] = a[j];//將a[j]填到a[i],a[j]變成一個坑 i++; } while(i<j && a[i] < m)//從前往後找比基數大的數 i++;
if(i<j) { a[j] = a[i];//將a[i]填到a[j],a[i]變成一個坑 j--; } } a[i] = m;//退出時,i=j,將基數填入坑中 return i; }

  

排序算法——快速排序