//// main.cpp// SortingAlgorithms//// Created by 孙江涛 on 13-10-12.// Copyright (c) 2013年 Bryan. All rights reserved.//#include <iostream>#include <vector>using std::vector;using std::cout;using std::endl;using std::cin;/* Start of Quick-Sort */long Partition(vector<unsigned int> &Vec,long p,long r){ unsigned int x = Vec[r]; long i = p - 1; for(long j = p;j < r;j++) if(Vec[j]<=x) { i = i+1; unsigned int temp = Vec[i]; Vec[i] = Vec[j]; Vec[j] = temp; } unsigned int temp = Vec[i+1]; Vec[i+1] = Vec[r]; Vec[r]=temp; return i+1;}void QuickSort(vector<unsigned int> &Vec,long p,long r){ if(p<r) { long q = Partition(Vec, p,r ); QuickSort(Vec, p, q-1); QuickSort(Vec, q+1,r); }}/* End of Quick-Sort *//* Start of Merge-Sort */void Merge(vector<unsigned int> &Vec,long start,long middle,long end){ long L_length = middle-start+1; long R_length = end - middle; vector<unsigned int> LVec; vector<unsigned int> RVec; long i,j,k; for(i = 0;i<L_length;i++) { LVec.push_back(Vec[start+i]); } for(j =0;j<R_length;j++) { RVec.push_back(Vec[middle+1+j]); } for(i = 0,j = 0, k =start;i < L_length && j<R_length;k++) { if(LVec[i]<= RVec[j]) { Vec[k] = LVec[i]; i++; } else if(LVec[i]>RVec[j]) { Vec[k] = RVec[j]; j++; } } if(i < L_length) { for(j = i;j < L_length;j++,k++) Vec[k] = LVec[j]; } if(j < R_length) { for(i = j;i < R_length;i++,k++) Vec[k] = RVec[i]; } }void MergeSort(vector<unsigned int> &Vec,long start,long end){ if(start==end) return; else if(start<end) { long middle = (start+end)/2; MergeSort(Vec, start, middle); MergeSort(Vec, middle+1, end); Merge(Vec,start,middle,end); return; } }/* End of Merge-Sort *//* Start of Random number generator */bool ProduceRandomNumberCRand(vector<unsigned int> &RandomVec,long size){ time_t t; srand((unsigned)time(&t)); for(long i=0;i<size;i++) { RandomVec.push_back((rand()<<17)|(rand()<<3)|(rand())); } if(RandomVec.size()==0) { return false; } return true;}/* End of Random number generator */void InsertionSort(vector<unsigned int> &Vec,long int size){ for(vector<unsigned int>::iterator it = Vec.begin()+1;it!= Vec.end();it++) { unsigned int key = *it; //unsigned int tmp; vector<unsigned int>::iterator it1 = it - 1; while (it1>=Vec.begin() && (*it1)>key) { *(it1+1) = *it1; it1--; } *(it1+1) = key; } }/* End of Insertation Sort *//* Start of RadixSort */int MaxBit(vector<unsigned int> &Vec,long n){ int BitNum = 1; for(vector<unsigned int>::iterator it = Vec.begin();it != Vec.end();it++ ) { int TempBitNum = 1; unsigned int TempNum= *it; while(TempNum/10) { TempNum =TempNum/10; TempBitNum++; } if(TempBitNum>BitNum) BitNum = TempBitNum; } return BitNum; }void RadixSort(vector<unsigned int> &Vec,long n){ int BitNum = MaxBit(Vec, Vec.size()); long count[10]; unsigned int *temp = new unsigned int[n]; int r = 1; for(int i = 0;i<BitNum;i++) { for(int j =0;j<10;j++) { count[j] = 0; } for(vector<unsigned int>::iterator it = Vec.begin();it != Vec.end();it++) { int k = ((*it)/r)%10; count[k]++; } for(int i = 1;i<10;i++) { count[i] += count[i-1]; } for(vector<unsigned int>::iterator it = Vec.end()-1;it != Vec.begin()-1;it--) { int k = ((*it)/r)%10; count[k]--; temp[count[k]] = *it; } int n = 0; for(vector<unsigned int>::iterator it = Vec.begin();it != Vec.end();it++,n++) { *it = temp[n]; } r *= 10; } }/* End of RadixSort */ /* 主函数 */int main(int argc, const char * argv[]){ long NumScale; cout<<"请输入数据规模(输入0退出)"<<endl; cin>>NumScale; while(NumScale!=0) { vector<unsigned int> UIVec; ProduceRandomNumberCRand(UIVec,NumScale); long double s_QuickSrot,e_QuickSrot,s_MergeSort,e_MergeSort,s_InsertionSort,e_InsertionSort,s_RadixSort,e_RadixSort; vector<unsigned int> UIVecQuickSort(UIVec); vector<unsigned int> UIVecMergeSort(UIVec); vector<unsigned int> UIVecInsertionSort(UIVec); vector<unsigned int> UIVecRadixSort(UIVec); s_QuickSrot = clock(); QuickSort(UIVecQuickSort, 0, UIVecQuickSort.size()-1); e_QuickSrot = clock(); s_MergeSort = clock(); MergeSort(UIVecMergeSort, 0, UIVecMergeSort.size()-1); e_MergeSort = clock(); s_InsertionSort = clock(); InsertionSort(UIVecInsertionSort, UIVecInsertionSort.size()); e_InsertionSort = clock(); s_RadixSort = clock(); RadixSort(UIVecRadixSort, UIVecRadixSort.size()); e_RadixSort = clock(); cout<<"QuickSort,time: "<<(e_QuickSrot-s_QuickSrot)/CLOCKS_PER_SEC<<"s"<<endl; cout<<"MergeSort,time: "<<(e_MergeSort-s_MergeSort)/CLOCKS_PER_SEC<<"s"<<endl; cout<<"InsertionSort,time: "<<(e_InsertionSort-s_InsertionSort)/CLOCKS_PER_SEC<<"s"<<endl; cout<<"RadixSort,time "<<(e_RadixSort-s_RadixSort)/CLOCKS_PER_SEC<<"s"<<endl; cout<<"请输入数据规模(输入0退出)"<<endl;cin>>NumScale; } return 0;}