一、快速排序
最坏情况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;
*a = *b;
*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] = ...{5, 4, 9, 0, 23, 3, 6, 1, 2, 10};
QuickSort(A, 0, 9);
for(i=0; i<10; i++)
printf("%3d", A[i]);
printf(" ");
return 0;
}
*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;
*a = *b;
*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] = ...{5, 4, 9, 0, 23, 3, 6, 1, 2, 10};
QuickSort(A, 0, 9);
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;
*a = *b;
*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] = ...{5, 4, 9, 0, 23, 3, 6, 1, 2, 10};
RandomizedQuickSort(A, 0, 9);
for(i=0; i<10; i++)
printf("%3d", A[i]);
printf(" ");
return 0;
}
*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;
*a = *b;
*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] = ...{5, 4, 9, 0, 23, 3, 6, 1, 2, 10};
RandomizedQuickSort(A, 0, 9);
for(i=0; i<10; i++)
printf("%3d", A[i]);
printf(" ");
return 0;
}