数据库入门级之算法(三)

发表于:2011-5-09 09:34

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:小风    来源:51Testing软件测试网采编

  之前我们跟随笔者重温了数据结构中的查询算法和部分排序算法,现在我们继续跟随笔者继续学习一些基本的排序算法。

  选择排序

  使用条件:可对比大小的集合。

  算法思想:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。

  举例编程:int b[10]={77,1,65,13,81,93,10,5,23,17}

  1. //简单选择排序 
  2. void SimpleSelect(int b[10])  
  3. {  
  4.     int temp;  
  5.     int i;  
  6.     for(i=0;i<9;i++)  
  7.     {  
  8.         for(int j=i+1;j<9;j++)  
  9.         {  
  10.             if(b[i]>b[j])  
  11.             {  
  12.                 temp=b[i];  
  13.                 b[i]=b[j];  
  14.                 b[j]=temp;  
  15.             }  
  16.         }  
  17.     }  
  18.     cout<<"the sort is:";  
  19.     for(int i=0;i<10;i++)  
  20.     {  
  21.         cout<<b[i]<<" ";  
  22.     }  
  23.     cout<<endl;  
  24. }

  性能分析:时间复杂度为O(n^2)

  ----------------------------------------------------------------------------------------------------

  堆排序

  使用条件:可对比大小的集合。

  算法思想:其实堆排序是简单选择排序的一种进化,它最主要是减少比较的次数。什么是堆?若将序列对应看成一个完全二叉树,完全二叉树中所有非终端节点的值均不大于(或者不小于)其左右孩子节点的值,可以称作为堆。由堆的性质可以知道堆顶是一个最大关键字(或者最小关键字)。在输出堆顶后,使剩下的元素又建成一个堆,然后在输出对顶。如此反复执行,便能得到一个有序序列,这个过程成便是堆排序。

  堆排序主要分为两个步骤:

  1、从无序序列建堆。

  2、输出对顶元素,在调成一个新堆。

  举例编程:int b[10]={77,1,65,13,81,93,10,5,23,17}

  1. //堆排序 
  2. void HeapSort(int b[10])  
  3. {  
  4.     void HeapAdjuest(int b[10],int min,int max);  
  5.     void Sawp(int *a,int *b);  
  6.     int i;  
  7.     //因为是完成二叉树,所以从最后一个非叶子节点开始堆转换 
  8.     for(i=9/2;i>=0;i--)  
  9.     {  
  10.         HeapAdjuest(b,i,9);  
  11.     }  
  12.     //拿出堆顶数据在从新堆排序 
  13.     for(i=9;i>0;i--)  
  14.     {  
  15.         Sawp(&b[i],&b[0]);  
  16.         HeapAdjuest(b,0,i-1);  
  17.     }  
  18. }  
  19. //堆调整(大顶堆) 
  20. //min 数据需要调整在数组中的开始位置 
  21. //max 数据需要调整在数据中的结束位置 
  22. void HeapAdjuest(int b[10],int min,int max)  
  23. {  
  24.     if(max<=min)return ;  
  25.     int temp;  
  26.     temp=b[min];  
  27.     int j;  
  28.     //延它的孩子节点循环 
  29.     for(j=2*min;j<=max;j*=2)  
  30.     {  
  31.         //选择它的大孩子 
  32.         if(j<max&&b[j]<b[j+1])  
  33.         {  
  34.             j++;  
  35.         }  
  36.         //堆顶小于它的孩子不做处理 
  37.         if(temp>b[j])  
  38.         {  
  39.             break;  
  40.         }  
  41.         //将大的数替换成小的数 
  42.         b[min]=b[j];  
  43.         min=j;  
  44.         }  
  45.     b[min]=temp;  
  46. }  
  47. //交换函数 
  48. void Sawp(int *a,int *b)  
  49. {  
  50.     int temp;  
  51.     temp=*a;  
  52.     *a=*b;  
  53.     *b=temp;  
  54. }

  性能分析:时间复杂度时间复杂度O(nlogn)

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号