快速排序(quicksort)演算法實現

weixin_33766168發表於2017-11-16
 快速排序(quicksort)是分治法的典型例子,它的主要思想是將一個待排序的陣列以陣列的某一個元素X為軸,使這個軸的左側元素都比X大,而右側元 素都比X小(從大到小排序)。然後以這個X在變換後陣列的位置i分為左右兩個子陣列,再分別進行快速排序,直到子陣列中只有一個元素為止。

快速排序演算法如下
void quicksort(int A[], int p, int r)
{
    int i;
    if(p < r)
    {
        i = partition(A, p, r);
        quicksort(A, 0, i - 1);
        quicksort(A, i + 1, r);
    }   
}

    其中partition函式將得到X所在的位置i(在這裡總以陣列的最後一個元素為軸)。
int partition(int A[], int p, int r)
{
    int i = p - 1, j;
    for(j = p; j < r; j++)
    {
        if(A[j] >= A[r])
        {
            i++;
            swap(&A[i], &A[j]);
        }
    }
    swap(&A[i + 1], &A[r]);
    return i + 1;
}

    由於總是選擇陣列的最後一個元素做為軸,因此可能出現X的左邊為n - 1或接近n - 1個元素,而右邊沒有元素,或元素很少的情況,即X最大或比較大。這樣使quicksort將出現最壞的情況,也就是時間複雜度為O(n^2)。因此partition可以採用隨機方式得到軸X的位置i。 這樣它的平均情況是非常好的(時間複雜度為O(nlogn)),也就是說,最壞情況很難出現。
int new_random(int min, int max)
{
    return (min + (int)(((float)rand()/RAND_MAX)*(max - min)));
}

int randomize_partition(int A[], int p, int r)
{
    int i = new_random(p, r);
    swap(&A[i], &A[r]);
    return partition(A, p, r);
}

完整的程式碼如下
#include <stdio.h>
#include <stdlib.h>

void out_int_array(int data[], int n)
{
    int i;
    for(i = 0; i < n; i++)
    {
        printf("%d ", data[i]);
    }
    printf("\n");
}
void swap(int *a, int *b)
{
    int x;
    x = *a;
    *a = *b;
    *b = x;
}

int new_random(int min, int max)
{
    return (min + (int)(((float)rand()/RAND_MAX)*(max - min)));
}
int partition(int A[], int p, int r)
{
    int i = p - 1, j;
    for(j = p; j < r; j++)
    {
        if(A[j] >= A[r])
        {
            i++;
            swap(&A[i], &A[j]);
        }
    }
    swap(&A[i + 1], &A[r]);
    return i + 1;
}

void quicksort(int A[], int p, int r)
{
    int i;
    if(p < r)
    {
        i = partition(A, p, r);
        quicksort(A, 0, i - 1);
        quicksort(A, i + 1, r);
    }   
}

int randomize_partition(int A[], int p, int r)
{
    int i = new_random(p, r);
    swap(&A[i], &A[r]);
    return partition(A, p, r);
}

void randomize_quicksort(int A[], int p, int r)
{
    int i;
    if(p < r)
    {
        i = randomize_partition(A, p, r);
        quicksort(A, 0, i - 1);
        quicksort(A, i + 1, r);
    }   
}

int main()
{
    int A[] = {4144, -12512530};
    int B[] = {4144, -12512530};
    out_int_array(A, 7);
    quicksort(A, 06);
    out_int_array(A, 7);
    printf("--------------------------randomize-----------------------------\n");   
    srand((unsigned)time( NULL ));
    randomize_quicksort(B, 06);
    out_int_array(B, 7);
    return 0;
}
本文轉自銀河使者部落格園部落格,原文連結http://www.cnblogs.com/nokiaguy/archive/2008/05/14/1197172.html如需轉載請自行聯絡原作者

銀河使者

相關文章