1. 程式人生 > >【劍指 offer】—— 快速排序

【劍指 offer】—— 快速排序

兩個輔助函式:

// 生成區間內的隨機整數
int RandInRange(int s, int e, unsigned seed=time_t(0))
{ 
    srand(seed);
    return rand()%(e-s)+s;
}

void Swap(int& a, int& b)
{
    int tmp = a; a = b; b = tmp;
}

分割槽函式:

int partition(int seq[], int len, int start, int end)
{
    if (seq == NULL || len <= 0 || start < 0
|| end >= len) throw new exception("Invalid parameters"); int pivot = RandInRange(start, end); Swap(seq[pivot], seq[end]); int small = start - 1; for (int i = start; i < end; ++i) { if (seq[i] < seq[end]) { ++small; if
(small != i) Swap(seq[small], seq[i]); } } ++small; Swap(seq[end], seq[small]); return small; }

主調函式,由遞迴結構定義:

void qsort(int seq[], int len, int start, int end)
{
    if (start == end)
        return;
    int idx = partition(seq, len, start, end);
    if (idx > start)
        qsort(seq, len
, start, idx-1); if (idx < end) qsort(seq, len, idx+1, end); }