一、快速排序
最坏情况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;
}
二、快速排序(随机化版本)
随机数产生器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;
}
本文详细介绍了快速排序的基本原理及其随机化版本。快速排序是一种高效的排序算法,最坏情况下时间复杂度为O(n^2),但平均性能优良,为O(nlgn)。文中提供了快速排序的C语言实现代码,并解释了如何通过随机化选择枢轴来改善最坏情况的发生概率。
1846

被折叠的 条评论
为什么被折叠?



