您的位置:首页 > 其它

算法导论-第7章 - 快速排序

2014-09-28 10:42 176 查看
7.1 <<-------------------------------------普通快速排序---------------------------------------->>

与归并排序一样,快速排序也使用了分治思想。数组被划分为两个(可能为空)子数组a[p...q-1]和a[q+1...r],使得a[p...q-1]的每一个元素都小于a[q],而a[q]也都小于等于a[q+1...r]中的每一个元素





void Swap(int *a, int *b)
{
    int t;

    t = *a;
    *a = *b;
    *b = t;
}

int Partion(int a[], int low, int high)
{
    int x;
    int i, j;

    x = a[high];
    i = low;
    for(j = low; j < high; j++)
    {
        if(a[j] <= x)
        {
            Swap(&a[i], &a[j]);
            i++;
        }
    }
    Swap(&a[i], &a[high]);

    return i;
}

void QuickSort(int a[], int low, int high)
{
    int mid;
    if(low < high)
    {
        mid = Partion(a, low, high);
        QuickSort(a, low, mid-1);
        QuickSort(a, mid+1, high);
    }
}
int main(void)
{
    int a[10] = {2, 5, 7, 9, 0, 1, 3, 4, 8, 6};
    int i;

    QuickSort(a, 0, 9);
    for(i = 0; i < 10; i++)
        printf("%d ", a[i]);

    return 0;
}

另外一种普通快排,和上一个类似。不同的是它每次一区间数组的第一个为判断节点,就只有Partion函数有改变,其他的函数可以参照上面的

int Partion(int a[], int low, int high)
{
    int x;
    int i, j;

    x = a[low];
    i = high;
    for(j = high; j > low; j--)
    {
        if(a[j] >= x)
        {
            Swap(&a[i], &a[j]);
            i--;
        }
    }
    Swap(&a[i], &a[low]);

    return i;
}

当快速排序终止时,它将数组分为3个集合,所有小于等于x元素的集合,大于x的集合和只有一个x一个元素的集合

快速排序的性能:

划分平衡时,快排性能和归并排序一样,如果不平衡,则接近于插入排序

平衡的划分:

快排的平均运行时间接近于其最好情况((nlog(n))),而非最坏情况((n^2))

快排可看成快速排列递归树



7.1 <<-------------------------------------快速排列的随机化版本---------------------------------------->>

快速排序的随机化对PARTION和QUICKSORT代码改动很小,在新的划分程序中,只是在划分前进行一次交换



>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-------------------------------------------------------------------

其实还有另外一种形式的快速排序的方法,但是实质是一样的,这种方式的快速排序也是比较常用的。如下所示:

int QuickPass(int a[], int low, int high)
{
    int x = a[low];

    if(low < high)
    {
        while(low < high)
        {
            while(low<high && a[high]>=x)
                high--;
            a[low] = a[high];
            while(low<high && a[low]<=x)
                low++;
            a[high] = a[low];
        }
        a[low] = x;
    }
    return low;
}
void QuickSort(int a[], int low, int high)
{
    int mid;

    if(low < high)
    {
        mid = QuickPass(a, low, high);
        QuickSort(a, low, mid-1);
        QuickSort(a, mid+1, high);
    }
}


个人感觉这种方法初看没有《算法导论》中的快速排序方法理解起来简单,但是理解后就会发现这种方式的排序也是很好的。^_^没有了两个数之间的数据交换,只是简单的赋值操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: