各种排序算法总结.docx

上传人:b****3 文档编号:973765 上传时间:2022-10-14 格式:DOCX 页数:16 大小:46.86KB
下载 相关 举报
各种排序算法总结.docx_第1页
第1页 / 共16页
各种排序算法总结.docx_第2页
第2页 / 共16页
各种排序算法总结.docx_第3页
第3页 / 共16页
各种排序算法总结.docx_第4页
第4页 / 共16页
各种排序算法总结.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

各种排序算法总结.docx

《各种排序算法总结.docx》由会员分享,可在线阅读,更多相关《各种排序算法总结.docx(16页珍藏版)》请在冰豆网上搜索。

各种排序算法总结.docx

各种排序算法总结

各种排序算法总结

排序算法有很多,所以在特定情景中使用哪一种算法很重要。

为了选择合适的算法,可以按照建议的顺序考虑以下标准:

()执行时间

()存储空间

()编程工作

对于数据量较小的情形,()()差别不大,主要考虑();而对于数据量大的,()为首要。

主要排序法有:

一、冒泡()排序——相邻交换

二、选择排序——每次最小大排在相应的位置

三、插入排序——将下一个插入已排好的序列中

四、壳()排序——缩小增量

五、归并排序

六、快速排序

七、堆排序

八、拓扑排序

九、锦标赛排序

十、基数排序

一、冒泡()排序

从小到大排序个数

()

{

(<)

{

(<)

{

([]>[])比较交换相邻元素

{

;

[];[][];[];

}

}

}

}

效率(²),适用于排序小列表。

二、选择排序

从小到大排序个数

()

{

;

(<)

{

;

(<)每次扫描选择最小项

([]<[]);

()找到最小项交换,即将这一项移到列表中的正确位置

{

;

[];[][];[];

}

}

}

效率(²),适用于排序小的列表。

三、插入排序

从小到大排序个数

()

{

(<)循环从第二个数组元素开始,因为[]作为最初已排序部分

{

[]标记为未排序第一个元素

;

(>[]>)*将与已排序元素从小到大比较,寻找应插入的位置*

{

[][];

;

}

[];

}

}

最佳效率();最糟效率(²)与冒泡、选择相同,适用于排序小列表

若列表基本有序,则插入排序比冒泡、选择更有效率。

四、壳()排序——缩小增量排序

从小到大排序个数

()

{

(<)增量递减

{

(<())重复分成的每个子列表

{

(<)对每个子列表应用插入排序

{

[];

;

(>[]>)

{

[][];

;

}

[];

}

}

}

}

适用于排序小列表。

效率估计(^)(^),取决于增量值的最初大小。

建议使用质数作为增量值,因为如果增量值是的幂,则在下一个通道中会再次比较相同的元素。

壳()排序改进了插入排序,减少了比较的次数。

是不稳定的排序,因为排序过程中元素可能会前后跳跃。

五、归并排序

从小到大排序

()

{

(>)每个子列表中剩下一个元素时停止

()*将列表划分成相等的两个子列表,若有奇数个元素,则在左边子列表大于右侧子列表*

()子列表进一步划分

();

[][]新建一个数组,用于存放归并的元素

(<<)*两个子列表进行排序归并,直到两个子列表中的一个结束*

{

([]<[];)

{

[][];

;

}

{[][];;}

}

(<)如果第二个子列表中仍然有元素,则追加到新列表

[][];

(<)如果在第一个子列表中仍然有元素,则追加到新列表中

[][];

(<)将排序的数组的所有元素复制到原始数组中

[][];

}

效率(),归并的最佳、平均和最糟用例效率之间没有差异。

适用于排序大列表,基于分治法。

六、快速排序

*快速排序的算法思想:

选定一个枢纽元素,对待排序序列进行分割,分割之后的序列一个部分小于枢纽元素,一个部分大于枢纽元素,再对这两个分割好的子序列进行上述的过程。

*(){;}

([])

{

[]采用子序列的第一个元素作为枢纽元素

(<)

{

从后往前栽后半部分中寻找第一个小于枢纽元素的元素

(<[]>)

{

;

}

将这个比枢纽元素小的元素交换到前半部分

([],[]);

从前往后在前半部分中寻找第一个大于枢纽元素的元素

(<[]<)

{

;

}

([][])将这个枢纽元素大的元素交换到后半部分

}

返回枢纽元素所在的位置

}

([])

{

(<)

{

();

();

();

}

}

平均效率(),适用于排序大列表。

此算法的总时间取决于枢纽值的位置;选择第一个元素作为枢纽,可能导致(²)的最糟用例效率。

若数基本有序,效率反而最差。

选项中间值作为枢纽,效率是()。

基于分治法。

七、堆排序

最大堆:

后者任一非终端节点的关键字均大于或等于它的左、右孩子的关键字,此时位于堆顶的节点的关键字是整个序列中最大的。

思想:

()令,并令=;

()计算的左孩子;

()若<=-,则转(),否则转();

()比较和,若>,则令=+,否则不变;

()比较和,若>,则令等于,并令,并转(),否则转()

()令等于,结束。

()

{对[]进行堆排序,不妨用[]做暂存单元

;

();将[]建成初始堆

(>;)对当前无序区[]进行堆排序,共做趟。

{

[][];[][];[][];将堆顶和堆中最后一个记录交换

();将[]重新调整为堆,仅有[]可能违反堆性质

}

}

堆排序的时间,主要由建立初始堆和反复重建堆这两部分的时间开销构成,它们均是通过调用实现的。

堆排序的最坏时间复杂度为()。

堆排序的平均性能较接近于最坏性能。

由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录数较少的文件。

堆排序是就地排序,辅助空间为(),

它是不稳定的排序方法。

堆排序与直接插入排序的区别:

直接选择排序中,为了从[]中选出关键字最小的记录,必须进行次比较,然后在[]中选出关键字最小的记录,又需要做次比较。

事实上,后面的次比较中,有许多比较可能在前面的次比较中已经做过,但由于前一趟排序时未保留这些比较结果,所以后一趟排序时又重复执行了这些比较操作。

堆排序可通过树形结构保存部分比较结果,可减少比较次数。

八、拓扑排序

例:

学生选修课排课先后顺序

拓扑排序:

把有向图中各顶点按照它们相互之间的优先关系排列成一个线性序列的过程。

方法:

在有向图中选一个没有前驱的顶点且输出

从图中删除该顶点和所有以它为尾的弧

重复上述两步,直至全部顶点均已输出(拓扑排序成功),或者当图中不存在无前驱的顶点(图中有回路)为止。

()*输出拓扑排序函数。

若无回路,则输出的顶点的一个拓扑序列并返回,否则返回*

{

[];

;

;

;

;

()对各顶点求入度[]

()初始化栈

(<)

("结点"[]"的入度为"[]);

(<)

{

([])

([]);

}

("拓扑排序输出顺序为:

");

(())

{

(());

();

()

{

("发生错误,程序结束。

");

();

}

([]);

;

([])

{

;

(!

([]))

([]);

}

}

(<)

("该图有环,出现错误,无法排序。

");

("排序成功。

");

}

算法的时间复杂度()。

九、锦标赛排序

锦标赛排序的算法思想与体育比赛类似。

首先将个数据元素两两分组,分别按关键字进行比较,得到/个比较的优胜者(关键字小者),作为第一步比较的结果保留下来,

然后对这/个数据元素再两两分组,分别按关键字进行比较,…,如此重复,直到选出一个关键字最小的数据元素为止。

<>

<>

<>

<>

{

 关键字

 [];

 最后胜的对手

 被击败的对手

 比赛次数

}[];

;

;

([])读取文件中的数据,并存放在数组[]中;最后返回数据的个数

{

 *;

 ;

 (,"");

 (,""[][]);

 (())

 {

  ;

  (,""[][]);  

 }

 ();

}

()创建胜者树,返回冠军(最小数)在数组[]中的下标

{

 ;

 记录当前冠军的下标

 (()<)

  ;

 ()求叶子结点数目

 (<)初始化叶子结点

 {

  [];

  [];

  [];

  (>)

   [];

 }

 (<)第一轮比赛

 {

  ;

  ([]<[])

  {

   [];

   [];

   [];

   [];

   ;

  }

  

  {

   [];

   [];

   [];

   [];

   ;

  }

 }

 记录连续的两个未被淘汰的选手的下标

 (<(()()))进行淘汰赛

 {

  (<)

  {

   ([][])找到一名选手

   {

    默认其为两选手中的后来的

    ()如果第一位置是空的,则刚来的选手先来的

     ;

    否则刚来的选手是后来的,那么选手都已到场比赛开始

    {

     ;

     ([]<[])先来的选手获胜

     {

      []最后赢的是

      []是被淘汰的

      [];

      []两选手场次均加  

      最小数下标为

      将,置

     }

     同理

     {

      [];

      [];

      [];

      [];      

      ;

      ;

     }

    }

   }

   

  }

  轮数加

 }

 返回冠军的下标

}

()锦标赛排序

{

 ()返回最小数下标

 *;

 ("","")为写入创建并打开文件

 ([])当最小值不是无穷大时

 {

  ("\"[][])输出数据 

  (,"\"[][])写入数据

  []将当前冠军用无穷大替换

  ()返回下一个冠军的下标  

 }

}

()

{

 ;

 [];

 (":

");

 ();

 ()读文件

 ()锦标赛排序

 ("\\");

 ;

}

十、基数排序

基数排序又被称为桶排序。

与前面介绍的几种排序方法相比较,基数排序和它们有明显的不同。

前面所介绍的排序方法都是建立在对数据元素关键字进行比较的基础上,所以可以称为基于比较的排序;

而基数排序首先将待排序数据元素依次“分配”到不同的桶里,然后再把各桶中的数据元素“收集”到一起。

通过使用对多关键字进行排序的这种“分配”和“收集”的方法,基数排序实现了对多关键字进行排序。

———————————————————————————————————————

例:

每张扑克牌有两个“关键字”:

花色和面值。

其大小顺序为:

花色:

♣<♦<♥<♠

面值:

<<……<<

扑克牌的大小先根据花色比较,花色大的牌比花色小的牌大;花色一样的牌再根据面值比较大小。

所以,将扑克牌按从小到大的次序排列,可得到以下序列:

♣,…,♣,♦,…,♦,♥,…,♥,♠,…,♠

这种排序相当于有两个关键字的排序,一般有两种方法实现。

其一:

可以先按花色分成四堆(每一堆牌具有相同的花色),然后在每一堆牌里再按面值从小到大的次序排序,最后把已排好序的四堆牌按花色从小到大次序叠放在一起就得到排序的结果。

其二:

可以先按面值排序分成十三堆(每一堆牌具有相同的面值),然后将这十三堆牌按面值从小到大的顺序叠放在一起,再把整副牌按顺序根据花色再分成四堆(每一堆牌已按面值从小到大的顺序有序),最后将这四堆牌按花色从小到大合在一起就得到排序的

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 成人教育 > 自考

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1