`
mmdev
  • 浏览: 13302488 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

数据结构复习之【排序】

 
阅读更多

排序:对一序列对象根据某个关键字进行排序;


稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;

不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面;

内排序:所有排序操作都在内存中完成;

外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;

排序耗时的操作:比较、移动;

排序分类:

(1)交换类:冒泡排序、快速排序;此类的特点是通过不断的比较和交换进行排序;

(2)插入类:简单插入排序、希尔排序;此类的特点是通过插入的手段进行排序;

(3)选择类:简单选择排序、堆排序;此类的特点是看准了再移动;

(4)归并类:归并排序;此类的特点是先分割后合并;

历史进程:一开始排序算法的复杂度都在O(n^2),希尔排序的出现打破了这个僵局;

以下视频是Sapientia University创作的,用跳舞的形式演示排序步骤,这些视频就可以当作复习排序的资料~

冒泡排序视频:http://v.youku.com/v_show/id_XMzMyOTAyMzQ0.html

选择排序视频:http://v.youku.com/v_show/id_XMzMyODk5MDI0.html

插入排序视频:http://v.youku.com/v_show/id_XMzMyODk3NjI4.html

希尔排序视频:http://v.youku.com/v_show/id_XMzMyODk5MzI4.html

归并排序视频:http://v.youku.com/v_show/id_XMzMyODk5Njg4.html

快速排序视频:http://v.youku.com/v_show/id_XMzMyODk4NTQ4.html

预备:最简单的排序


此种实现方法是最简单的排序实现;

缺点是每次找最小值都是单纯的找,而没有为下一次寻找做出铺垫;

算法如下:



一、冒泡排序


冒泡排序相对于最简单的排序有了改进,即每次交换都是对后续有帮助的,大数将会越来越大,小的数将会越来越小;

冒泡排序思想:两两相邻元素之间的比较,如果前者大于后者,则交换

因此此排序属于交换排序一类,同类的还有现在最常用的排序方法:快速排序;


1.标准冒泡排序


此种方法是最一般的冒泡排序实现,思想就是两两相邻比较并交换;

算法实现如下:



2.改进冒泡排序


改进在于如果出现一个序列,此序列基本是排好序的,如果是标准的冒泡排序,则还是需要进行不断的比较;

改进方法:通过一个boolean isChanged,如果一次循环中没有交换过元素,则说明已经排好序;

算法实现如下:



二、简单选择排序

简单选择排序特点:每次循环找到最小值,并交换,因此交换次数始终为n-1次;

相对于最简单的排序,对于很多不必要的交换做了改进,每个循环不断比较后记录最小值,只做了一次交换(当然也可能不交换,当最小值已经在正确位置)

算法如下:


三、简单插入排序


思想: 给定序列,存在一个分界线,分界线的左边被认为是有序的,分界线的右边还没被排序,每次取没被排序的最左边一个和已排序的做比较,并插入到正确位置;我们默认索引0的子数组有序;每次循环将分界线右边的一个元素插入有序数组中,并将分界线向右移一位;

算法如下:


简单插入排序比选择排序和冒泡排序好!


四、希尔排序


1959年Shell发明;

第一个突破O(n^2)的排序算法;是简单插入排序的改进版;

思想:由于简单插入排序对于记录较少或基本有序时很有效,因此我们可以通过将序列进行分组排序使得每组容量变小,再进行分组排序,然后进行一次简单插入排序即可;

这里的分组是跳跃分组,即第1,4,7位置为一组,第2,5,8位置为一组,第3,6,9位置为一组;


索引

1

2

3

4

5

6

7

8

9


此时,如果increment=3,则i%3相等的索引为一组,比如索引1,1+3,1+3*2

一般增量公式为:increment = increment/3+1;

算法实现如下:


五、堆排序

Floyd和Williams在1964年发明;

大根堆:任意父节点都比子节点大;

小根堆:任意父节点都比子节点小;


不稳定排序算法,是简单选择排序的改进版;

思想:构建一棵完全二叉树,首先构建大根堆,然后每次都把根节点即最大值移除,并用编号最后的节点替代,这时数组长度减一,然后重新构建大根堆,以此类推;

注意:此排序方法不适用于个数少的序列,因为初始构建堆需要时间;

算法实现如下:


六、归并排序


稳定排序算法;

思想:利用递归进行分割和合并,分割直到长度为1为止,并在合并前保证两序列原本各自有序,合并后也有序;

实现代码如下:


七、快速排序


冒泡排序的升级版;现在用的最多的排序方法;

思想:选取pivot,将pivot调整到一个合理的位置,使得左边全部小于他,右边全部大于他;

注意:如果序列基本有序序列个数较少,则可以采用简单插入排序,因为快速排序对于这些情况效率不高;

实现代码如下:


优化方案


(1)选取pivot:选取pivot的值对于快速排序至关重要,理想情况,pivot应该是序列的中间数;

而前面我们只是简单的取第一个数作为pivot,这点可以进行优化;

优化方法:抽多个数后取中位数作为pivot;

(2)对于小数组使用插入排序:因为快速排序适合大数组排序,如果是小数组,则效果可能没有简单插入排序来得好;


如果想进行优化,则可以使用以下代码:



对比图


此图摘自http://www.cnblogs.com/cj723/archive/2011/04/29/2033000.html的图




总结:每个排序都有每个排序的优点,我们需要在适当的时候用适当的算法;

比如在基本有序、数组规模小时用直接插入排序;

比如在大数组时用快速排序;

比如如果要想稳定性,则使用归并排序;



摘录维基百科图片:








分享到:
评论

相关推荐

    数据结构复习资料 数据结构 复习 资料

    这份"数据结构复习资料"包含了全面的学习资源,特别是模拟题及答案,对于准备相关考试或提升编程技能来说极其有价值。 一、数据结构基础 数据结构主要分为两大类:线性结构和非线性结构。线性结构如数组、链表、栈...

    数据结构复习代码

    本压缩包“数据结构复习代码”包含了用于学习数据结构的相关代码,非常适合正在学习或复习数据结构的人士。 数据结构主要分为两大类:线性结构和非线性结构。线性结构包括数组、链表、栈和队列。数组是最基础的数据...

    计算机考研数据结构复习指导Word版

    这份"计算机考研数据结构复习指导Word版"提供了一条有效的学习路径,帮助考生们精准定位并攻克这个领域的关键点。 复习指导文档《复习指导(数据结构部分).doc》可能涵盖了以下内容: 1. **基本概念**:数据结构...

    华南理工大学数据结构复习提纲二

    华南理工大学的“数据结构复习提纲二”文档无疑为备考的学生提供了宝贵的资源,涵盖了重要的概念、问题及其解答。在这个复习提纲中,我们可以期待找到关于以下关键知识点的详细内容: 1. **基本概念**:数据结构是...

    北京邮电大学809数据结构复习指南

    【北京邮电大学809数据结构复习指南】是一份由成功上岸北邮AI院的学长编写的详尽复习资料,旨在帮助备考北邮研究生考试的学生,特别是那些选择809数据结构作为专业课的考生。复习指南依据北邮研究生招生网的考试大纲...

    西工大组原和数据结构复习资料

    【组成原理】 组成原理是计算机科学与技术领域中的基础课程,主要研究计算机硬件系统的组成和工作原理。...这份“西工大组原和数据结构复习资料”将涵盖这两个领域的关键知识点,是深入学习的好材料。

    数据结构复习资料及试卷(c++版)

    本复习资料及试卷(C++版)是针对软件工程专业和计算机专业学生的重要学习资源,旨在帮助他们深入理解和掌握数据结构的基本概念、算法及其在C++编程中的实现。 1. **链表**:链表是一种动态数据结构,每个元素...

    数据结构复习资料

    以下是基于“数据结构复习资料”这个主题,结合提供的压缩包文件内容,所涵盖的一些关键知识点的详细说明: 1. **数组**:数组是最基本的数据结构,它是由相同类型的元素按照特定顺序排列的集合。在数组中,每个...

    数据结构复习重点归纳

    2. 线性表:线性表是最基础的数据结构之一,分为顺序存储和链式存储。顺序存储包括静态链表和动态分配,链式存储则涉及单链表、循环链表、双向链表和双向循环链表。重点是理解这些结构的操作,如插入、删除、查找,...

    数据结构复习题及答案

    这份“数据结构复习题及答案”压缩包提供了丰富的学习材料,帮助学习者巩固和理解数据结构的基本概念、算法及其应用。 1. **基本概念** - **数据结构**:数据结构是指数据的组织方式,包括数组、链表、栈、队列、...

    数据结构期末复习例题

    本段内容首先总结了数据结构的一些基础知识,随后通过一系列例题展示了数据结构在实际...综合来看,文档所涵盖的内容是数据结构学习的重要部分,不仅包括理论知识,还涉及具体的实现和应用,适合期末复习时参考和练习。

    数据结构考研复习资料

    数据结构是计算机科学与技术专业研究生入学考试中的核心科目之一,它主要研究如何在计算机中组织和管理数据,以便高效地进行存储、检索和处理。本复习资料旨在帮助考生全面理解和掌握数据结构的基础理论、基本概念和...

    清华严蔚敏 数据结构复习重点

    "数据结构复习重点归纳(适于清华严蔚敏)-PDF格式.pdf"这份文档很可能是对严蔚敏教授教材的重点提炼,包含了关键概念、公式、例题和解题策略。"使用说明.URL"可能是一个链接,指向更多学习资源或者解答常见问题的...

    2018级数据结构复习资料_settlersfme_数据结构_数据结构复习_

    本复习资料“2018级数据结构复习资料_settlersfme_数据结构_数据结构复习”是针对学习者进行期末考试准备的宝贵资源,虽然没有直接的答案,但通过这些资料,学习者可以深入理解和掌握数据结构的基本概念、方法和应用...

    数据结构复习重点归纳(适于清华严)

    本文将针对“数据结构复习重点归纳(适于清华严版教材)”进行详细的解析,旨在帮助备考者明确复习要点。 首先,数据结构的章节结构通常分为:概论、线性表、栈和队列、串、多维数组和广义表、树和二叉树、图、查找...

    数据结构 考试 试卷 数据结构期末复习

    本资料主要针对数据结构期末考试进行复习,涵盖了数据结构的基本概念、主要类型以及相关的算法设计与分析。 1. **基本概念**:在数据结构中,数据是信息的载体,而数据结构则是数据的组织方式。常见的数据结构有数...

Global site tag (gtag.js) - Google Analytics