仅仅在原来的快速排序基础上增加了取随机数为划分点,改进了原有快排使用第一个元素作为划分元素的缺点,即减少了遇到最坏情况的可能。
-
#include<iostream>
-
#include<time.h>
-
using namespace std;
-
-
#define N 20 // 最大数组个数
-
-
#define MULTIPLIER 0x015A4E35L
-
#define INCREMENT 1
-
-
static unsigned long seed;
-
-
/* 生成随机数种子 */
-
void random_seed ( unsigned long d ) {
-
if (d== 0 ) {
-
seed = time ( 0 );
-
} else {
-
seed = d;
-
}
-
}
-
-
/* 生成一个low~high范围内的随机数 */
-
unsigned int random ( unsigned long low, unsigned long high ) {
-
seed = MULTIPLIER * seed + INCREMENT;
-
return ( (seed>> 16 )% (high-low )+low );
-
}
-
-
/*
-
* 按枢点元素划分序列
-
* 输入:数组A[],序列的起始位置low,终止位置high
-
* 输出:按枢点元素划分的序列A[],枢点元素位置i
-
*/
-
template<class Type>
-
int split (Type A [ ], int low, int high ) {
-
int k, i = low;
-
Type x= A [low ];
-
for (k = low +1; k<=high; k++ ) {
-
if (A [k ]<=x ) {
-
i ++;
-
if (i!=k ) {
-
swap (A [i ], A [k ] );
-
}
-
}
-
}
-
swap (A [low ], A [i ] );
-
return i;
-
}
-
-
/*
-
* 初始化随机数并执行快排
-
* 输入:数组A[],序列的起始位置low,终止位置high
-
* 输出:排序好的序列A[]
-
*/
-
template<class Type>
-
void quicksort_random (Type A [ ], int low, int high ) {
-
random_seed ( 0 );
-
r_quicksort (A, low, high );
-
}
-
-
/*
-
* 随机选择枢点的快速排序
-
* 输入:数组A[],序列的起始位置low,终止位置high
-
* 输出:排序好的序列A[]
-
*/
-
template<class Type>
-
void r_quicksort (Type A [ ], int low, int high ) {
-
int k;
-
if ( low < high ) {
-
k = random (low, high );
-
swap (A [low ], A [k ] );
-
k = split (A, low, high );
-
r_quicksort (A, low, k -1 );
-
r_quicksort (A, k +1, high );
-
}
-
}
-
-
int main ( ) {
-
int A [N ];
-
int i, n;
-
-
cin>>n;
-
-
for (i= 0; i<n; i++ )cin>>A [i ];
-
-
quicksort_random (A, 0,n -1 );
-
-
for (i= 0; i<n -1; i++ )cout<<A [i ]<< " ";
-
cout<<A [n -1 ]<<endl;
-
-
return 0;
-
}