算法设计之快速排序的随机化版本 (C++实现)

来源:互联网 发布:windows官方主题 云 编辑:程序博客网 时间:2024/06/06 19:24

在上一篇文章中,我写了快速排序的实现,不过快速排序的运行时间依赖于划分是否平衡,而平衡与否又依赖于用于划分的元素。如果划分是平衡的,那么快速排序算法的性能与归并排序一样,都为O(nlgn),如果划分是不平衡的那么快速排序的性能就接近插入排序。为了使快速排序的平均运行性能达到最优,采用随机抽样。与我在上一篇文章中始终用A[r]作为主元不同,这次我从 A[p,r]中随机的选择一个元素作为主元 。因为主元是从输入数组中随机选取的,所以在平均情况下,对输入数组的划分是比较均衡的。这样,期望的运行时间将达到O(nlgn)

// randomized-quicksort.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "iostream"using namespace std;void randomizedQuickSort(int* ,int ,int);int randomizedPartition(int*,int,int);int partition(int*,int,int);void swap(int&,int&);int _tmain(int argc, _TCHAR* argv[]){int A[10]={4,5,6,45,8,45,67,34,68,87};int p=0;int r=9;randomizedQuickSort(A,p,r);for(int i=0;i<=r;i++)cout<<A[i]<<",";cout<<endl;return 0;}void randomizedQuickSort(int* A,int p,int r){int q=0;if(p<r){q=randomizedPartition(A,p,r);randomizedQuickSort(A,p,q-1);randomizedQuickSort(A,q+1,r);}}int randomizedPartition(int* A,int p,int r){int i=rand()%(r-p+1)+p;swap(A[i],A[r]);return partition(A,p,r);}int partition(int* A,int p,int r){int x=A[r];int i=p-1;for(int j=p;j<r;j++){if(A[j]<x){i++;swap(A[j],A[i]);}}swap(A[r],A[i+1]);return i+1;}void swap(int& a,int& b){int temp=a;a=b;b=temp;}


0 0
原创粉丝点击