六种种排序算法:冒泡排序、选择排序、插入排序、快速排序、合并排序、堆排序。这里包含了所有的测试代码以及相应的测试用例。这里的代码,对于快速排序、合并排序都是使用的递归的算法。这里没有列出堆排序,是因为堆排序可以作为动态集合的排序算法,由下一篇博客来介绍。
#include <iostream> #include <ctime> #include <climits> #include <cstdlib> #include <algorithm> #define RESET "\033[0m" #define BLACK "\033[30m" /* Black */ #define RED "\033[31m" /* Red */ #define GREEN "\033[32m" /* Green */ #define YELLOW "\033[33m" /* Yellow */ #define BLUE "\033[34m" /* Blue */ #define MAGENTA "\033[35m" /* Magenta */ #define CYAN "\033[36m" /* Cyan */ #define WHITE "\033[37m" /* White */ #define BOLDBLACK "\033[1m\033[30m" /* Bold Black */ #define BOLDRED "\033[1m\033[31m" /* Bold Red */ #define BOLDGREEN "\033[1m\033[32m" /* Bold Green */ #define BOLDYELLOW "\033[1m\033[33m" /* Bold Yellow */ #define BOLDBLUE "\033[1m\033[34m" /* Bold Blue */ #define BOLDMAGENTA "\033[1m\033[35m" /* Bold Magenta */ #define BOLDCYAN "\033[1m\033[36m" /* Bold Cyan */ #define BOLDWHITE "\033[1m\033[37m" /* Bold White */ using namespace std; class sort_algorithm { public: void swap(int &a, int &b) { if(&a==&b) return; int tmp=a; a=b; b=tmp; } void bubble_sort(int A[], int n) { if (A==NULL) return; for(int i=0;i<n;++i) { for(int j=1;j<n-i;++j) { if(A[j-1]>A[j]) swap(A[j-1],A[j]); } } } void selection_sort(int A[], int n) { if (A==NULL) return; for(int i =0;i<n;++i) { int min_index=i; for(int j=i+1;j<n;++j) { if(A[min_index]>A[j]) min_index=j; } swap(A[i],A[min_index]); } } void insertion_sort(int A[], int n) { if (A==NULL) return; for(int i=1;i<n;++i) { int tmp=A[i]; int j=i-1; while(j>=0 && A[j]>tmp) { A[j+1]=A[j]; --j; } A[j+1]=tmp; } } int partition(int A[], int n) { srand(time(NULL)); int sel=rand()%n; swap(A[n-1],A[sel]); int j=0; for(int i=0;i<n-1;++i) { if(A[i]<A[n-1]) swap(A[j++],A[i]); } swap(A[j],A[n-1]); return j; } void quick_sort(int A[], int n) { if(A==NULL) return; if (n>1) { int mid=partition(A,n); quick_sort(A,mid); quick_sort(A+mid+1,n-mid-1); } } void merge(int A[], int from, int mid, int to) { int *left=new int[mid-from+1]; int *right=new int[to-mid+2]; for(int i=from;i<mid;++i) left[i-from]=A[i]; for(int i=mid;i<=to;++i) right[i-mid]=A[i]; left[mid-from]=right[to-mid+1]=INT_MAX; int i1=0,i2=0; for(int i=from;i<=to;++i) { if(left[i1]<right[i2]) A[i]=left[i1++]; else A[i]=right[i2++]; } delete[] left; delete[] right; } void merge_sort(int A[], int n) { if(A==NULL) return; if(n>1) { int mid=n/2; merge_sort(A,mid); merge_sort(A+mid,n-mid); merge(A,0,mid,n-1); } } void test_bubble() { cout<<"test_bubble begins..."<<endl; int *A1=NULL; int A2[]={1}; const int oA2[]={1}; int A3[]={5,4,3,2,1}; const int oA3[]={1,2,3,4,5}; int A4[]={1,2,3,3}; const int oA4[]={1,2,3,3}; int A5[]={}; const int oA5[]={}; bubble_sort(A1,0); match(A1,NULL,0); bubble_sort(A2,1); match(A2,oA2,1); bubble_sort(A3,5); match(A3,oA3,5); bubble_sort(A4,4); match(A4,oA4,4); bubble_sort(A5,0); match(A5,oA5,0); for(int i=0;i<10;++i) { srand(time(NULL)); int *A=new int[i]; int *oA=new int[i]; for(int j=0;j<i;++j) { A[j]=rand()%10; oA[j]=A[j]; } bubble_sort(A,i); sort(oA,oA+i); match(A,oA,i); delete[] A; delete[] oA; } cout<<"test_bubble ends..."<<endl; } void test_selection() { cout<<"test_selection begins..."<<endl; int *A1=NULL; int A2[]={1}; const int oA2[]={1}; int A3[]={5,4,3,2,1}; const int oA3[]={1,2,3,4,5}; int A4[]={1,2,3,3}; const int oA4[]={1,2,3,3}; int A5[]={}; const int oA5[]={}; selection_sort(A1,0); match(A1,NULL,0); selection_sort(A2,1); match(A2,oA2,1); selection_sort(A3,5); match(A3,oA3,5); selection_sort(A4,4); match(A4,oA4,4); selection_sort(A5,0); match(A5,oA5,0); for(int i=0;i<10;++i) { srand(time(NULL)); int *A=new int[i]; int *oA=new int[i]; for(int j=0;j<i;++j) { A[j]=rand()%10; oA[j]=A[j]; } selection_sort(A,i); sort(oA,oA+i); match(A,oA,i); delete[] A; delete[] oA; } cout<<"test_selection ends..."<<endl; } void test_insertion() { cout<<"test_insertion begins..."<<endl; int *A1=NULL; int A2[]={1}; const int oA2[]={1}; int A3[]={5,4,3,2,1}; const int oA3[]={1,2,3,4,5}; int A4[]={1,2,3,3}; const int oA4[]={1,2,3,3}; int A5[]={}; const int oA5[]={}; insertion_sort(A1,0); match(A1,NULL,0); insertion_sort(A2,1); match(A2,oA2,1); insertion_sort(A3,5); match(A3,oA3,5); insertion_sort(A4,4); match(A4,oA4,4); insertion_sort(A5,0); match(A5,oA5,0); for(int i=0;i<10;++i) { srand(time(NULL)); int *A=new int[i]; int *oA=new int[i]; for(int j=0;j<i;++j) { A[j]=rand()%10; oA[j]=A[j]; } insertion_sort(A,i); sort(oA,oA+i); match(A,oA,i); delete[] A; delete[] oA; } cout<<"test_insertion ends..."<<endl; } void test_quick() { cout<<"test_quick begins..."<<endl; int *A1=NULL; int A2[]={1}; const int oA2[]={1}; int A3[]={5,4,3,2,1}; const int oA3[]={1,2,3,4,5}; int A4[]={1,2,3,3}; const int oA4[]={1,2,3,3}; int A5[]={}; const int oA5[]={}; quick_sort(A1,0); match(A1,NULL,0); quick_sort(A2,1); match(A2,oA2,1); quick_sort(A3,5); match(A3,oA3,5); quick_sort(A4,4); match(A4,oA4,4); quick_sort(A5,0); match(A5,oA5,0); for(int i=0;i<10;++i) { srand(time(NULL)); int *A=new int[i]; int *oA=new int[i]; for(int j=0;j<i;++j) { A[j]=rand()%10; oA[j]=A[j]; } quick_sort(A,i); sort(oA,oA+i); match(A,oA,i); delete[] A; delete[] oA; } cout<<"test_quick ends..."<<endl; } void test_merge() { cout<<"test_merge begins..."<<endl; int *A1=NULL; int A2[]={1}; const int oA2[]={1}; int A3[]={5,4,3,2,1}; const int oA3[]={1,2,3,4,5}; int A4[]={1,2,3,3}; const int oA4[]={1,2,3,3}; int A5[]={}; const int oA5[]={}; merge_sort(A1,0); match(A1,NULL,0); merge_sort(A2,1); match(A2,oA2,1); merge_sort(A3,5); match(A3,oA3,5); merge_sort(A4,4); match(A4,oA4,4); merge_sort(A5,0); match(A5,oA5,0); for(int i=0;i<10;++i) { srand(time(NULL)); int *A=new int[i]; int *oA=new int[i]; for(int j=0;j<i;++j) { A[j]=rand()%10; oA[j]=A[j]; } merge_sort(A,i); sort(oA,oA+i); match(A,oA,i); delete[] A; delete[] oA; } cout<<"test_merge ends..."<<endl; } void test() { test_bubble(); test_selection(); test_insertion(); test_quick(); test_merge(); } bool match(const int A[], const int B[], int n) { bool ret=true; if (A==NULL && B==NULL) ret=true; else if (A==NULL || B==NULL) ret=false; else { for(int i=0;i<n;++i) if (A[i]!=B[i]) ret=false; } if(ret) cout<<GREEN<<"SUCCEEDED. "; else cerr<<RED<<"FAILED. "; cout<<"A: {"; for(int i=0;i<n;++i) cout<<A[i]<<','; cout<<"}. B: {"; for(int i=0;i<n;++i) cout<<B[i]<<','; cout<<"}."<<RESET<<endl;; return ret; } }; int main() { sort_algorithm s; s.test(); return 0; }