#include<iostream> #include<fstream> #include<ctime> using namespace std; inline void Swap(int& a,int& b){ int t=a; a=b; b=t; } inline int findPivot(int* array,int l,int r){//r-l>=offset (10) int center=l+(r-l)/2; if(array[l]>array[center]) Swap(array[l],array[center]); if(array[l]>array[r]) Swap(array[l],array[r]); if(array[center]>array[r]) Swap(array[center],array[r]); Swap(array[center],array[r-1]); return array[r-1]; } inline void insertionSort(int* array,int l){ for(int i=1;i<l;++i){ int t=array[i]; int j; for(j=i-1;j>=0;--j) if(array[j]>t) array[j+1]=array[j]; else break; array[j+1]=t; } } void Qsort(int* array,int l,int r){ static int offset=10; if(l+offset<=r){ int t=findPivot(array,l,r); int i=l,j=r-1; while(1){ while(array[++i]<t); while(array[--j]>t); if(i>=j)break; Swap(array[i],array[j]); } Swap(array[i],array[r-1]); Qsort(array,l,i-1); Qsort(array,i+1,r); } else insertionSort(array+l,r-l+1); } void QSort(int* array,int l){ Qsort(array,0,l-1); } int main(){ const int MAX=1000000; int *array=new int[MAX]; ifstream in("millionNumbers.txt"); clock_t b,e; b=clock(); { int t; for(int i=0;i<MAX;++i){ in>>t; array[i]=t; } } e=clock(); cout<<"time of reading file is: "<<(e-b)<<" ms"<<endl; b=clock(); QSort(array,MAX); e=clock(); cout<<"time of qsort is: "<<(e-b)<<" ms"<<endl; ofstream out("QSort.txt"); for(int i=0;i<MAX;++i) out<<array[i]<<"/t"; delete[] array; return 0; }