DoogooFeng Learn to C++

小实验,四种排序算法性能比较

原文地址http://www.cppblog.com/newcnzz/archive/2012/10/02/192624.html

闲着没事,做个小小的测试,测试一下冒泡,选择,插入和快速四种排序对同一个含有1000000个元素的数组排序所用的时间,做个比较。

四种排序的代码如下:

冒泡排序:

  1. template <typename T>  
  2. void bubble_sort(T a[], int num){  
  3.     if(num ==0 || num == 1)  
  4.         return ;  
  5.     bool changed = false;  
  6.     do{  
  7.         for(int i=0; i<num-1; i++){  
  8.             if(a[i] < a[i+1]){  
  9.                 swap(a[i], a[i+1]);  
  10.                 changed = true;  
  11.             }  
  12.         }  
  13.           
  14.     }while(changed);  
  15. }  

 

选择排序:

  1. template <typename T>  
  2. void select_sort(T a[], int num){  
  3.     T min;  
  4.     int locate;//最小值位置   
  5.     for(int i=0; i<num-1; i++){  
  6.         min = a[i];  
  7.         //找最小值   
  8.         for(int j=i+1; j<num; j++){  
  9.             if(a[j] < min){  
  10.                 locate = j;  
  11.             }  
  12.         }  
  13.         swap(a[i], a[locate]);  
  14.     }  
  15. }  

 

插入排序:

  1. template <typename T>  
  2. void insert_sort(T a[], int num){  
  3.     int j;  
  4.     int temp;//暂存无序区待插入元素   
  5.     for(int i=1; i<num; ++i){  
  6.         j = i;  
  7.         temp = a[i];  
  8.         //待插入元素与有序区元素一一比较   
  9.         while(j > 0 && temp < a[j-1]/*如果小于有序区被比较元素*/){  
  10.             //则将有序区元素后移   
  11.             a[j] = a[j-1];  
  12.             //将被比较元素前移一位   
  13.             --j;  
  14.         }  
  15.         //将待插入元素插入相应位置   
  16.         a[j] = temp;  
  17.     }  
  18. }  

 

快速排序:

  1. template <typename T>  
  2. void quick_sort(T a[], int num)  
  3. {  
  4.     //如果一个元素,不用排   
  5.     if(num ==1)  
  6.         return ;  
  7.     //如果只有两个元素没必要分界   
  8.     if(num == 2){  
  9.         if(a[1] < a[0])  
  10.             swap(a[1], a[0]);  
  11.         return ;  
  12.     }  
  13.     //取中间元素为界,希望可以将两部分尽量分的均匀一些   
  14.     swap(a[num/2], a[0]);  
  15.     T bound = a[0];  
  16.     //声明左右两个指针变量   
  17.     T* L = a+1;  
  18.     T* R = a+num-1;  
  19.     //作比较,不合适的交换,直至一趟排序完成   
  20.     while(L < R){  
  21.         while(L < R && *L < bound)  
  22.             ++L;  
  23.         while(R >= L && *R > bound)  
  24.             --R;  
  25.         if(L < R)  
  26.             swap(*L, *R);  
  27.     }  
  28.     if(*R < bound)  
  29.         swap(*R, *a);  
  30.     //递归排序两个分开的子序列   
  31.     quick_sort(a, R-a);  
  32.     quick_sort(R+1, num-1-(R-a));  
  33. }  

 

测试程序如下:

  1. #include <iostream>   
  2. using namespace std;  
  3. #include <ctime>   
  4.   
  5. int main()  
  6. {  
  7.     const int N=100000;  
  8.     int a[N];  
  9.     while(1){     
  10.         for(int i=0; i<N; i++)  
  11.             a[i] = N-i;  
  12.         int choice;  
  13.         cout<<"1.bubble 2.insert 3.select 4.quick"<<endl;  
  14.         clock_t t1;  
  15.         clock_t t2;  
  16.         cin >> choice;  
  17.         switch(choice)  
  18.         {  
  19.             case 1:  
  20.                 t1 = clock();  
  21.                 bubble_sort(a, N);  
  22.                 t2 = clock();  
  23.                 break;  
  24.             case 2:  
  25.                 t1 = clock();  
  26.                 insert_sort(a, N);  
  27.                 t2 = clock();  
  28.                 break;  
  29.             case 3:  
  30.                 t1 = clock();  
  31.                 select_sort(a, N);  
  32.                 t2 = clock();  
  33.                 break;  
  34.             case 4:  
  35.                 t1 = clock();  
  36.                 quick_sort(a, N);  
  37.                 t2 = clock();  
  38.                 break;  
  39.         }  
  40.         cout << double(t2-t1)/CLOCKS_PER_SEC << endl;  
  41.     }     
  42.     return 0;  
  43. }  

 

测试结果如下图:

从上图可以看出,快排确实很快,冒泡让人无语,插入比选择稍快一些。

posted on 2012-10-03 02:06 doogoofeng 阅读(151) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2012年10月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

导航

统计

常用链接

留言簿

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜