很早之前看学姐写过的一个快排算法,当时琢磨了很久来着,现在我们开的有 算法设计与分析 这门课,书上有讲快排的,琢磨了好一会儿嘞^_^
具体代码如下啦:
#include<stdio.h>
#include<stdlib.h>
// 快排算法平均时间复杂度为 O(nlogn), 最坏情况下为 O(n^2)
#define Type int
Type a[10]={0};
void Swap( Type &x, Type &y)
{
Type t;
t = x;
x = y;
y = t;
}
int Partion( Type a[], int p, int r )
{ // p,r 为起始和终止坐标
int i = p, j = r + 1;
// i = rand()%(r-p+1) + p; // 随机选择划分基准点 注意:i 值大小介于 p 到 r 间
// Swap(a[i], a[p]);
Type x = a[i];
// i = p;
while(1)
{
while( a[++i] < x && i < r) // i 的值小于 r, 当 i 的值为 r 时并不进行交换,所以就不用循环了
{}
while( a[--j] > x && j > p)
{}
if(i >= j)
break;
Swap( a[i], a[j]);
}
a[p] = a[j]; // 只能这样做,假如不事先把 a[p] 单独拿出来,不然直接交换结束后,
a[j] = x; // i 和 j 到底哪个指的是值为 x 的,是不确定的
return j;
}
void QuickSort( Type a[], int p, int r)
{
if( p < r)
{
int q = Partion( a, p, r);
QuickSort( a, p, q-1);
QuickSort( a, p+1, r);
}
}
int main()
{
int i;
printf("Please enter 10 elements: ");
for( i = 0; i < 10; i++)
scanf("%d", &a[i]);
QuickSort( a, 0, 9);
for( i = 0; i < 10; i++)
printf("%d ", a[i]);
printf("\n");
return 0;
}
快速排序算法的性能取决于划分的对称性,通过修改 Partition 可以设计出采用随机选择策略的快速排序算法。在快速排序算法的每一步当中,当数组还没有被划分时,可以在 a[p] 到 a[r] 间随机选出一个元素作为划分基准,这样可以使划分基准的选择是随机的,从而可以期望划分时较对称的。
把上面代码中,添上我注释掉的代码就是 RandomizedPartition 了~~
其中用到了 rand() 函数来产生一个随机数,为控制随机数介于 p 到 r 间,利用了模运算O(∩_∩)O