转载出处:http://www.cppblog.com/liyuxia713/archive/2010/01/24/106332.html
Quicksort是一个很好的排序算法,但是其最坏情况运行时间是O(n^2), 还不如Mergesort的O(nlgn),
如何改进Quicksort? 引进随机化思想
- 一种方法: 对给定的待排序序列,随机地重排列
- 另一种方法:随机选取pivot
/**
* 2010.1.24
* 随机快速排序法
* pivot元素并不是简单地取第一个元素,而是随机生成一个下标,以对应的元素为pivot
5 */
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
//交换两个元素值
void swap(int& a , int& b)
{
int temp = a;
a = b;
b = temp;
}
//输出数组
void print(int* a , int n)
{
for(int i = 0; i < n ; i++)
cout << a[i]<<",";
cout << endl;
}
//返回属于[p,q)的随机整数
int rand(int p,int q)
{
int size = q-p+1;
return p+ rand()%size;
}
//分割
int RandPartition(int* a, int p , int q)
{
//普通的分割方法和随机化分割方法的区别就在于下面三行
swap(a[rand(p,q)], a[p]);
int key = a[p];
int i = p;
for(int j = p+1; j <= q; j++)
{
if(a[j] <= key)
{
i = i+1;
if(i != j)
swap(a[i], a[j]);
}
}
swap(a[i],a[p]);
return i;
}
//逐步分割排序
void RandQuickSortMid(int* a, int p, int q)
{
if(p<q)
{
int i = RandPartition(a,p,q);
RandQuickSortMid(a,p,i-1);
RandQuickSortMid(a,i+1,q);
}
}
//调用
void RandQuickSort(int* a, int n)
{
//记录运行时间
clock_t start,end;
start = clock();
RandQuickSortMid(a,0,n-1);
end = clock();
cout << "Running time: " << (double)(end-start)/CLOCKS_PER_SEC << endl;
}
int main()
{
const int N = 20;
int *a = new int[N];
for(int i = 0; i < N; i++)
a[i] = rand();
print(a,N);
RandQuickSort(a,N);
print(a,N);
system("pause");
return 0;
}