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

来源:互联网 发布:电信4g网络接入点设置 编辑:程序博客网 时间:2024/05/17 01:08

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);    }}

个人感觉这种方法初看没有《算法导论》中的快速排序方法理解起来简单,但是理解后就会发现这种方式的排序也是很好的。^_^没有了两个数之间的数据交换,只是简单的赋值操作。



0 0