随机化快速排序算法

转载出处: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;
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值