#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;}