快速排序及其优化

来源:互联网 发布:查看手机4g网络dns 编辑:程序博客网 时间:2024/05/18 03:03
#include <iostream>#include <algorithm>  //调用C++自带Sort#include <crtdbg.h>#include <cstdlib>#include <windows.h> using namespace std;#define MAX 1000000#define K  12#ifdef _DEBUG#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)#endif // _DEBUG// memory leak checkinline void EnableMemCheck(){_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);}//插入排序声明void InsertSort(int s[],int n);int SelectMid(int a[]);//划分函数int Partion(int a[],int p,int r){ int x=a[r],temp; int i=p-1,j=p; for(;j<r;j++){if(a[j]<x){i++;temp=a[j];a[j]=a[i];a[i]=temp;}}a[r]=a[i+1];a[i+1]=x;return i+1;}int BetterPartion(int a[],int p,int r){   //采用更优的划分 int x=SelectMid(a),temp; int i=p-1,j=p; for(;j<r;j++){if(a[j]<x){i++;temp=a[j];a[j]=a[i];a[i]=temp;}}a[r]=a[i+1];a[i+1]=x;return i+1;}int SelectMid(int a[]){int b[5]={a[0],a[1],a[2],a[3],a[4]};    InsertSort(b,5);return b[2];}//快速排序void QuickSort(int a[],int p,int r){int q;if(p<r){q=Partion(a,p,r);QuickSort(a,p,q-1);QuickSort(a,q+1,r);}}//插入排序实现void InsertSort(int s[],int n){    int temp,i,j;      for (i=1;i<n;i++)      {          temp=s[i];          j=i;          while(temp<s[j-1]){            s[j]=s[j-1];            j--;          }          s[j]=temp;      } }void BetterQuick(int a[],int p,int r){int q;if(p<r){if(r-p<K){         //当问题规模小于K时使插入排序InsertSort(a,r-p+1);  }/*else if(r-p>MAX/2){      //当问题规模较大时,采用更优的划分,效果不明显    q=BetterPartion(a,p,r);BetterQuick(a,p,q-1);BetterQuick(a,q+1,r);}**/else{q=Partion(a,p,r);BetterQuick(a,p,q-1);BetterQuick(a,q+1,r);}     }}int main(){EnableMemCheck();int *arr=new int[MAX];int *arr1=new int[MAX];int *arr2=new int[MAX];for(int i=0; i<MAX; i++){arr[i]=rand();arr1[i]=arr[i];arr2[i] = arr[i];}cout<<endl;cout<<endl;cout<<endl;LARGE_INTEGER liFrequency;LARGE_INTEGER liStart;LARGE_INTEGER liEnd;QueryPerformanceFrequency(&liFrequency); // get clock frequency//调用优化过的QuickSortQueryPerformanceCounter(&liStart); // time startBetterQuick(arr, 0, MAX-1);QueryPerformanceCounter(&liEnd); // time endcout << "After BetterSort(" <<(liEnd.QuadPart-liStart.QuadPart)*1000000/liFrequency.QuadPart<< "μs): ";//for(int i=0; i<MAX; i++) cout << arr[i] << " ";cout << endl;cout<<endl;cout<<endl;//调用QuickSort函数QueryPerformanceCounter(&liStart); // time startQuickSort(arr1,0,MAX-1);QueryPerformanceCounter(&liEnd); // time endcout << "the Quick Sort method takes :" <<(liEnd.QuadPart-liStart.QuadPart)*1000000/liFrequency.QuadPart<< "μs): ";//for(int i=0; i<MAX; i++) cout << arr1[i] << " ";cout << endl;//调用C++自带的Sort函数//QueryPerformanceCounter(&liStart); // time start//std::sort(arr2,arr1+MAX);//QueryPerformanceCounter(&liEnd); // time end//cout << "the System Sort method takes :" <<//(liEnd.QuadPart-liStart.QuadPart)*1000000/liFrequency.QuadPart//<< "μs): ";//for(int i=0; i<MAX; i++) cout << arr1[i] << " ";cout << endl;delete arr;delete arr1;delete arr2;system("PAUSE");return 0;}

原创粉丝点击