常用排序算法比较

1.稳定性比较

 插入排序、冒泡排序、二叉树排序、二路归并排序及其他线形排序是稳定的

 选择排序、希尔排序、快速排序、堆排序是不稳定的

2.时间复杂性比较

 插入排序、冒泡排序、选择排序的时间复杂性为O(n2)

 其它非线形排序的时间复杂性为O(nlog2n)

 线形排序的时间复杂性为O(n);

3.辅助空间的比较

 线形排序、二路归并排序的辅助空间为O(n),其它排序的辅助空间为O(1);

4.其它比较

插入、冒泡排序的速度较慢,但参加排序的序列局部或整体有序时,这种排序能达到较快的速度。

反而在这种情况下,快速排序反而慢了。

当n较小时,对稳定性不作要求时宜用选择排序,对稳定性有要求时宜用插入或冒泡排序。

若待排序的记录的关键字在一个明显有限范围内时,且空间允许是用桶排序。

当n较大时,关键字元素比较随机,对稳定性没要求宜用快速排序。

当n较大时,关键字元素可能出现本身是有序的,对稳定性有要求时,空间允许的情况下。

宜用归并排序。

当n较大时,关键字元素可能出现本身是有序的,对稳定性没有要求时宜用堆排序。

5、算法思想简述:

(1)冒泡排序:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。冒泡排序是稳定的。算法时间复杂度O(n2)。

(2)选择排序:在要排序的一组数中,选出最小的一个数与第一个位置的数交换,然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。选择排序是不稳定的。算法复杂度O(n2)。

(3)插入排序:在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排 好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。直接插入排序是稳定的。算法时间复杂度O(n2)。

(4)希尔排序:算法先将要排序的一组数按某个增量d分成若干组,每组中记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序。当增量减到1时,整个要排序的数被分成一组,排序完成。希尔排序是不稳定的。

(5)快速排序:快速排序是对冒泡排序的一种本质改进。它的基本思想是通过一趟扫描后,使得排序序列的长度能大幅度地减少。在冒泡排序中,一次扫描只能确保最大数值的数移到正确位置,而待排序序列的长度可能只减少1。快速排序通过一趟扫描,就能确保某个数(以它为基准点吧)的左边各数都比它小,右边各数都比它大。然后又用同样的方法处理它左右两边的数,直到基准点的左右只有一个元素为止。

下面贴代码:

  1. #include "stdafx.h"  
  2. #include <stdio.h>  
  3.   
  4.   
  5. int data1[]={25, 18, 12 ,10, 2 };  
  6. int data2[]={34,32,20,16,6};  
  7. int data3[10];  
  8. int data[10]={75,23,98,44,57,12,29,64,38,82};  
  9.   
  10. void bubleSort(int data[] , int size);  
  11. void select_sort(int data[] , int size);  
  12. void insertion_sort(int data[] , int size);  
  13. void merge_sort(int data1[],int size1,int data2[],int size2,int data3[]);  
  14. void quick_sort(int data[] ,int left ,int right,int size);  
  15. void deleteMax(int data[] , int size);  
  16. void percolateDown(int data[],int target ,int size);  
  17. void buildMaxHeap(int data[] , int size);  
  18. void heapSort(int data[], int size);  
  19. void shell_Sort(int data[],int size);  
  20. void shell_Sort(int data[],int size);  
  21.   
  22.   
  23. int main(int argc, char* argv[])  
  24. {  
  25.       
  26.   
  27. //  bubleSort(data ,5);  
  28. //  select_sort(data ,5);  
  29. //  insertion_sort(data,5);  
  30. //  merge_sort(data1,5,data2,5,data3);  
  31. //  quick_sort( data1 ,0 ,4,5);  
  32. //  heapSort(data1,5);  
  33. //  shell_Sort(data,11);  
  34.     return 0;  
  35. }  
  36.   
  37. //冒泡排序  
  38. void bubleSort(int data[] , int size)  
  39. {  
  40.     int i,j,k;  
  41.     int temp;  
  42.     int flag=0;  
  43.     printf("buble Sorting Proceddure/n");  
  44.   
  45.     for (i=0;i<size-1;i++)  
  46.     {  
  47.         flag =0;  
  48.         for (j=0;j<size-i-1;j++)  
  49.         {  
  50.             if (data[j] > data[j+1])  
  51.             {  
  52.                 flag = 1;  
  53.                 temp = data[j];  
  54.                 data[j] = data[j+1];  
  55.                 data[j+1] = temp;  
  56.             }  
  57.         }  
  58.         printf("Sorting %d times: ",i+1);  
  59.         for(k=0;k<size;k++)  
  60.             printf("%d ",data[k]);  
  61.         printf("/n");  
  62.         if(!flag)break;  
  63.     }  
  64.     printf("_______________________________/n");  
  65. }  
  66.   
  67. //选择排序  
  68. void select_sort(int data[] , int size)  
  69. {  
  70.     int i,j,k;  
  71.     int temp,pos;  
  72.       
  73.     printf("Select Sorting Proceddure/n");  
  74.     for (i=0;i<size-1;i++)  
  75.     {  
  76.         pos = i;  
  77.         for(j=i+1;j<size;j++)  
  78.         {  
  79.             if(data[j] < data[pos])  
  80.                 pos = j;  
  81.         }  
  82.         temp =data[i];  
  83.         data[i] = data[pos];  
  84.         data[pos] = temp;  
  85.         printf("Sorting %d times: ",i+1);  
  86.         for(k=0;k<size;k++)  
  87.             printf("%d ",data[k]);  
  88.         printf("/n");  
  89.   
  90.     }  
  91.     printf("_______________________________/n");  
  92. }  
  93.   
  94. //插入排序  
  95. void insertion_sort(int data[] , int size)  
  96. {  
  97.     int i,k;  
  98.     int temp,pos;  
  99.       
  100.     printf("Insertion Sorting Proceddure/n");  
  101.       
  102.     for (i=1;i<size;i++)  
  103.     {  
  104.         temp = data[i];  
  105.         pos = i;  
  106.         while (pos>0 && data[pos-1]>temp)  
  107.         {  
  108.             data[pos] = data[pos-1];  
  109.             pos--;  
  110.         }  
  111.         data[pos] = temp;  
  112.   
  113.         printf("Sorting %d times: ",i);  
  114.         for(k=0;k<size;k++)  
  115.             printf("%d ",data[k]);  
  116.         printf("/n");  
  117.   
  118.     }  
  119.     printf("_______________________________/n");  
  120. }  
  121.   
  122. //归并排序  
  123. void merge_sort(int data1[],int size1,int data2[],int size2,int data3[])  
  124. {  
  125.     int arg1=0,arg2=0;  
  126.     int arg3,i;  
  127.       
  128.     printf("Merge Sorting Proceddure/n");  
  129.     select_sort(data1,size1);  
  130.     select_sort(data2,size2);  
  131.       
  132.     for(arg3=0;arg3<size1+size2&&arg1<size1&&arg2<size2;arg3++)  
  133.     {  
  134.         if (data1[arg1]<data2[arg2])  
  135.         {  
  136.             data3[arg3] = data1[arg1];  
  137.             arg1++;  
  138.         }  
  139.         else if (data1[arg1]>data2[arg2])  
  140.         {  
  141.             data3[arg3]= data2[arg2];  
  142.             arg2++;  
  143.         }  
  144.         else  
  145.         {  
  146.             data3[arg3] = data1[arg1];  
  147.             arg1++;  
  148.             arg2++;  
  149.         }  
  150.           
  151.     }  
  152.     while (arg1<size1)  
  153.     {  
  154.         data3[arg3++]=data1[arg1++];  
  155.     }  
  156.     while (arg2<size2)  
  157.     {  
  158.         data3[arg3++]=data2[arg2++];  
  159.     }  
  160.     printf("Merge sort: ");  
  161.     for (i=0;i<size1+size2;i++)  
  162.         printf("%d ",data3[i]);  
  163.     printf("/n");  
  164.     printf("___________________________________________________________/n");  
  165.       
  166. }  
  167.   
  168. //快速排序  
  169. void quick_sort(int data[] ,int left ,int right,int size)  
  170. {  
  171.     int lbase,rbase,temp,i;  
  172.   
  173.     lbase = left+1;  
  174.     rbase = right;  
  175.     if(left<right)  
  176.     {     
  177.         lbase = left+1;  
  178.         rbase = right;  
  179.         while (data[lbase] < data[left])  
  180.             lbase++;          
  181.         while(data[rbase]>data[left])  
  182.             rbase--;  
  183.         while (lbase<rbase)  
  184.         {  
  185.             temp = data[lbase];  
  186.             data[lbase] = data[rbase];  
  187.             data[rbase] = temp;  
  188.             lbase++;  
  189.             rbase--;  
  190.             while (data[lbase] < data[left])  
  191.                 lbase++;          
  192.             while(data[rbase]>data[left])  
  193.                 rbase--;  
  194.         }  
  195.   
  196.         temp = data[left];  
  197.         data[left] = data[rbase];  
  198.         data[rbase] = temp;  
  199.           
  200.         for (i=0;i<size;i++)  
  201.             printf("%d ",data[i]);  
  202.         printf("/n");  
  203.         quick_sort(data,left,rbase-1,size);  
  204.         quick_sort(data,rbase+1,right,size);  
  205.     }  
  206. }  
  207.   
  208.   
  209. /**********************堆排序begin*************************/  
  210. //改造大根堆  
  211.   
  212. void buildMaxHeap(int data[] , int size)  
  213. {  
  214.     int i;  
  215.     for (i=size/2-1;i>=0;i--)  
  216.     {  
  217.         percolateDown(data,i,size);  
  218.     }  
  219.           
  220. }  
  221.   
  222. //删除最大值  
  223. void deleteMax(int data[] , int size)  
  224. {  
  225.     int tmp;  
  226.     tmp = data[0];  
  227.     data[0] =data[size-1];  
  228.     data[size-1] = tmp;  
  229.     percolateDown(data, 0, --size);    
  230. }  
  231.   
  232. //下滤  
  233.   
  234. void percolateDown(int data[],int target ,int size)  
  235. {  
  236.     int child=0;  
  237.     int temp=data[target];  
  238.     for (; (target*2+1)<=(size-1); target=child)  
  239.     {  
  240.         child = target*2 + 1;  
  241.         if (child<size-1 && (data[child+1] > data[child]))  
  242.             child++;  
  243.         if (data[child]>temp)  
  244.             data[target] = data[child];  
  245.         else  
  246.             break;  
  247.     }  
  248.     data[target] = temp;  
  249. }  
  250.   
  251. void heapSort(int data[], int size)  
  252. {  
  253.     int j;  
  254.   
  255.     buildMaxHeap(data, size);  
  256.     for (int i=size; i>=1; i--)  
  257.     {  
  258.         deleteMax(data, i);  
  259.         for (j=0;j<size;j++)  
  260.             printf("%d ",data[j]);  
  261.         printf("/n");  
  262.     }  
  263.   
  264. }  
  265.   
  266. //希尔排序  
  267.   
  268. void shell_Sort(int data[],int size)  
  269. {  
  270.     int step,i,j,temp,k;  
  271.   
  272.     step=size/2;  
  273.     while (step>0)  
  274.     {  
  275.         for (i=step+1;i<size;i++)  
  276.         {  
  277.             j=i-step;  
  278.             while (j>0)  
  279.             {  
  280.                 if (data[j] > data[j+step])  
  281.                 {  
  282.                     temp = data[j];  
  283.                     data[j] = data[j+step];  
  284.                     data[j+step] = temp;  
  285.                     j-=step;  
  286.                 }  
  287.                 else j=0;  
  288.             }  
  289.   
  290.   
  291.         }  
  292.         for (k=0;k<size;k++)  
  293.             printf("%d ",data[k]);  
  294.         printf("/n");  
  295.         step/=2;  
  296.     }  
  297.     printf("sorting result : ");  
  298.     for (k=0;k<size;k++)  
  299.         printf("%d ",data[k]);  
  300.   
  301.   
  302. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值