计算机考研:数据结构常用算法精析(9)

计算机考研:数据结构常用算法精析(9)

  

  数据结构是计算机考研408计算机学科专业基础综合的重要组成部分,考生需要认真复习,尤其是对于数据结构中一些常用的算法问题,考生一定要弄懂弄会,理解的去掌握。小编下面一一为大家分析一下,帮助考生更好地去掌握。

  第十章

  内部排序(在内存中进行的排序不需要访问外存的)外部排序(排序量很大,通过分批的读写外存,最终完成排序)

  稳定排序和非稳定排序:看相同记录的相对次序是否回发生改变。主要看在排序过程中的比较是不是相邻记录,如果是相邻比较,一定是稳定的排序。如果不是相邻的比较,就是不稳定的。

  内排序方法 截止目前,各种内排序方法可归纳为以下五类:

  (1)插入排序;(2)交换排序;(3)选择排序;(4)归并排序; (5)基数排序。

  插入排序:包括直接插入排序和希尔排序

  直接插入排序:(稳定的)

  算法描述

  void Insort (sqList &L) ∥对顺序文件F直接插入排序的算法∥

  { int i,j;

  for (i=2;i<=L.len;i++) ∥插入n-1个记录∥

  {

  if(L.R[i].key

  { L.R[0]=L.R[i]; ∥待插入记录先存于监视哨∥

  L.R[i]=L.R[i-1];

  for(j=i-2;L.R[0].key

  L.R[j+1]=L.R[j]; ∥记录顺序后移∥

  L.R[j+1]=L.R[0]; ∥原R[i]插入j+1位置∥

  }

  }

  }

  算法分析

  设排序中key比较次数为C,C最小时记为Cmin,最大时记为Cmax。

  (1)当原来就有序(正序)时,每插入一个R[i]只需比较key一次,即:

  (2)当原本逆序(key从大到小)时,每插入一个R[i]要和子表中i-1个key比较,加上同自身R[0]的比较,此时比较次数最多,即:

  (3)记录总的移动次数m(m最小时记为mmin,最大时记为mmax)

  正序时,子表中记录的移动免去,即:

  逆序时,插入R[i]牵涉移动整个子表。移动次数为2+(i-1)=i+1,此时表的移动次数最大,即:

  排序的时间复杂度取耗时最高的量级,故直接插入排序的T(n)=O(n2)。

  Shell(希尔)排序又称“缩小增量”排序(不稳定的)

  交换类的排序:(起泡排序和快速排序)

  起泡排序算法描述

  void Bubsort (sqList &L)

  { int i,flag; ∥flag为记录交换的标记∥

  Retype temp;

  for (i=L.len;i>=2;i–) ∥最多n-1趟排序∥

  { flag=0; //记录每一趟是否发生了交换

  for (j=1;j<=i-1;j++) ∥一趟的起泡排序∥

  if (L.R[j].key>L.R[j+1].key) ∥两两比较∥

  { temp=L.R[j]; ∥R[j] Û R[j+1]∥

  L.R[j]=L.R[j+1];

  L.R[j+1]=temp;

  flag=1;

  }

  if (flag==0) break; ∥无记录交换时排序完毕∥

  }

  }

  算法分析

  设待排长度为n,算法中总的key比较次数为C。若正序,第一趟就无记录交换,退出循环,Cmin=n-1=O(n);若逆序,则需n-1趟排序,每趟key的比较次数为i-1(2≤i≤n),故:

  同理,记录的最大移动次数为:

  故起泡排序的时间复杂度T(n)=O(n2)。并且是稳定的。

  快速排序:(不稳定的,时间复杂度O(nlogn)),不需要辅助空间,但有最好和最差之分

.xqy_container .xqy_core .xqy_core_main .xqy_core_text{height:auto !important;}

计算机考研:数据结构常用算法精析(9)

未经允许不得转载:考研网 » 计算机考研:数据结构常用算法精析(9)

赞 (0) 打赏

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏