排序和顺序统计学——快速排序

来源:互联网 发布:淘宝售后处理方案 编辑:程序博客网 时间:2024/04/30 08:07

一、快速排序
最坏情况O(n^2),平均性能相当好,期望的运行时间为O(nlgn),且其隐含的常数因子很小。另外,它还能够进行原地置换排序。
采用分治模式
分解:数组A[p...r]被划分成两个非空子数组A[p...q-1]和A[q+1...r],使得A[p...q-1]的每个元素都小于等于A[q+1...r];
解决:通过递归调用快速排序对子数组A[p...q-1]和A[q+1...r]排序;
合并:因为两个子数组是原地排序的,不需要将他们合并,整个数组A[p...r]已排序。

/*
 *Copyright(c) 2008 All rights reserved.
 *
 *Quick Sort
 *Author:Greentea
 *Date:01.20
 
*/

#include 
<stdio.h>

void Exchange(int *a, int *b)
{
    
int temp;
    temp 
= *a;
    
*= *b;
    
*= temp;
}


void QuickSort(int *a, int p, int r)
{
    
int q;

    
if(p < r)
    
{
        q 
= Partition(a, p, r);
        QuickSort(a, p, q
-1);
        QuickSort(a, q
+1, r);
    }

}


int Partition(int *a, int p, int r)
{
    
int i, j, x;

    i 
= p - 1;
    x 
= a[r];
    
for(j = p; j < r; j++)
    
{
        
if(a[j] <= x)
        
{
            i
++;
            Exchange(
&a[i], &a[j]);
        }

    }

    Exchange(
&a[i+1], &a[r]);

    
return i+1;
}


int main(int argc, char **argv)
{
    
int i;
    
int A[10= {549023361210};
    
    QuickSort(A, 
09);
    
for(i=0; i<10; i++)
        printf(
"%3d", A[i]);
    printf(
" ");

    
return 0;
}

 

二、快速排序(随机化版本)
随机数产生器Random(a, b):返回一个介于a和b之间的整数,(包括a和b),且产生每个整数的可能性都是相同的。
快速排序的随机化版本有个有趣的性质:没有一个特别的输入会导致最坏情况性态,这种算法的最坏情况性态是由随机数产生器决定的。

/*
 *Copyright(c) 2008 All rights reserved.
 *
 *Quick Sort
 *Author:Greentea
 *Date:01.20
 
*/

#include 
<stdio.h>
/*
 *产生介于low - high之间的随机数包括low和high
 *Input:    low
 *            high
 *Return:    random_num
 *
 *
 
*/

int Random(int low, int high)
{
    
int random_num;

    srand((unsigned)time(NULL));
    random_num 
= (rand() % (high - low + 1)) + low;

    
return random_num;
}


void Exchange(int *a, int *b)
{
    
int temp;
    temp 
= *a;
    
*= *b;
    
*= temp;
}


void RandomizedQuickSort(int *a, int p, int r)
{
    
int q;

    
if(p < r)
    
{
        q 
= RandomizedPartition(a, p, r);
        RandomizedQuickSort(a, p, q
-1);
        RandomizedQuickSort(a, q
+1, r);
    }

}


int Partition(int *a, int p, int r)
{
    
int i, j, x;

    i 
= p - 1;
    x 
= a[r];
    
for(j = p; j < r; j++)
    
{
        
if(a[j] <= x)
        
{
            i
++;
            Exchange(
&a[i], &a[j]);
        }

    }

    Exchange(
&a[i+1], &a[r]);

    
return i+1;
}


int RandomizedPartition(int *a, int p, int r)
{
    
int i;

    i 
= Random(p, r);
    Exchange(
&a[i], &a[r]);

    
return Partition(a, p, r);
}


int main(int argc, char **argv)
{
    
int i;
    
int A[10= {549023361210};
    
    RandomizedQuickSort(A, 
09);
    
for(i=0; i<10; i++)
        printf(
"%3d", A[i]);
    printf(
" ");

    
return 0;
}
原创粉丝点击