Learning Data Structure_7_排序

浑沦吞枣的过了一遍数据结构,今天把最后一章排序的内容结束。大概实现了一个星期看完的想法,当然不是为了求速度,这一次看主要是把各种数据结构做到心中有数,概念清晰,了解各自有哪些经典的算法和算法思路原理。以后若要用到特定的结构和算法再去算法导论中详细研读。下面是今天的学习笔记。

排序(ranking)

1.排序可看成是对线性表的操作;多个关键字排序可转化成单个关键字排序;排序的稳定和不稳定;主要讲内排序,其排序算法主要受3方面影响:时间性能,辅助空间,算法复杂性。

2.按复杂度分:简单算法(冒泡排序、简单选择排序、直接插入排序),改进算法(希尔排序、堆排序、归并排序、快速排序)

3.冒泡排序

基本思想:是一种交换排序,两两比较相同相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。

初级版:找第i小的记录时,将第i个格子里的元素与i+1位比较,小的放i位;继续将i位与i+2位比较,直至将i位于第n位比较交换,得到第i小的记录;再进行下一轮找第i+1小的记录。

正宗的冒泡排序:找第i小的记录时,要同时比较和交换 n-i 次(总n个记录),小的元素经比较交换上浮至第i个位置中。

冒泡优化:若在某轮上浮中没有发生交换(设置一个是否发生交换的标记flag),则已有序,停止之后的冒泡,结束程序。

4.简单选择排序

原理:通过n-i次比较,从n-i-1个记录中选出最小后,将其与第i位的记录交换;

与冒泡的区别:冒泡是比较一次伴随一次交换;简单选择法是一轮中多次比较完后,进行一次交换。

5.直接插入排序

原理:将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。类似于理扑克的过程。

6.希尔排序

基本有序:小的基本在前,大的基本在后。

原理:跳跃分割——不稳定,将相聚某个增量的记录组成一个子序列,在子序列内部进行直接插入都的结果依然是基本有序的。将间隔由n/2依次按规律减小,直至1(最后一个增量必须是1)

7.堆排序

堆:是这样性质的完全二叉树——每个结点的值都大于或等于其左右孩子结点的值——大顶堆(或<=小顶堆)。

排序背景:简单选择排序在每轮比较时,并没有把比较结果保存下来,导致后几轮重复前面的一些比较——改进就是每轮选到最小记录时,根据该轮的比较结果对其他记录做出相应的调整。

排序原理:将待排序的序列构造成一个大顶堆(HeapAdjust函数),此时整个序列的最大值就是根节点,将其移除后由树的末尾元素填补得到一个新的完全二叉树,将其用HeapAdjust函数重新调整为一个大顶堆,重复上述过程,直至最后一个有孩子的结点。

大顶堆构造函数HeapAdjust:将当前结点找到他左右子结点的较大值,互换,再找到其子节点的较大值互换。

8.归并排序

原理:假设初序列含n个记录,看做n个长为1的有序的子序列,两两有序归并(merge函数),得到不小于n/2个的最小整数有序序列,再两两归并,直至得到一个长为n的有序序列为止;递归;

merge函数:合并两个有序序列SR[i..m]、SR[m+1..n];i,j对应的记录谁小谁存入TR[k],谁就++,另一不变,同时k++;进入下一轮,i,j对应的元素继续比较..,直至i增加到大于m或j增加到大于n。

改进占用内存的递归实现归并排序:用迭代。

9.快速排序

原理:通过一趟排序对待排序的序列分成两部分,左边的记录均比枢轴小,右边的比枢轴大——Partiton函数实现;再将左右两部分内部分别进行上述分割,递归实现。

Partiton函数(返回左右排好后枢轴pivot所在的位置):每一轮中,找到序列右端起j--第一个比pivot小的与其交换,使小的在其左侧,找到序列左端起i++第一个比pivot大的与其交换,使大的在其右侧;直至i和j相等为止。

优化——Partiton函数算法实现中对于枢轴pivot的选择,固定选取、随机选取、三数取中、九数取中;

优化不必要的交换:Partiton函数中的每轮左右排序,比较多次,但只交换一次。

优化小数组时的排序方案:当high-low小于某个常数时,直接用直接排序法。

优化递归转迭代省空间。

10.上述7种排序的时间性能(最好、最差、平均),空间性能、稳定性、适用的序列数量规模等的综合考量选择最合适的排序方法。

Learning Data Structure_7_排序

时间: 2024-10-12 14:53:38

Learning Data Structure_7_排序的相关文章

Learning Data Structure_4_树(2)和图(1)

今天杂事较多,学习时间比较分散,所以效率不是很高,看的内容也较少,总体来看,这四天把数据结构的内容看了过半,还剩图.查找和排序三章,争取接下来三天内把数据结构的内容结束掉.下面是今天的学习内容. 树(tree) 1.前序遍历算法:与二叉树的定义一样采用递归形式. 2.中序和后序遍历与前序类似用递归实现:前.中.后是指单次递归算法中访问根节点的顺序 3.已知(前+中)or(后+中)序遍历序列可以唯一确定一颗二叉树:单已知 前+后 则不能. 4.扩展二叉树:将每个结点的空孩子指针引出一个虚结点:扩展

Learning Data Structure_5_图(2)

天气越来越热,看书还得静得下心啊,今天继续图这一章,概念和算法众多,第一遍看以广度优先的形式为主,以后若要用到具体的算法再去翻"算法导论"吧.下面是学习内容和笔记. 图(graph) 1.图的存储结构 邻接矩阵:顶点数组 + 边数组(二元):无向图的边数组为对称矩阵,有向图非对称(行的元素和表顶点的出度和,列对应入度和):网图的边数组中元素由布尔型变为权值. 邻接表:顶点表(data+firstedge) + 边表(adjvex+next):有向图的边表分出边表和入边表:带权的网图,在

Learning Data Structure_3_串和树(1)

今天找兼职继续碰壁中,吃过中饭接着蹲图书馆看数据结构,呵呵,被KMP算法虐了一下午,恨啊,当初上数据结构选修课的时候怎么没好好听呢.下面是今天的学习笔记. 串(string) 1.定义:是由0个或多个字符组成的有限序列,即字符串. 2.串的比较通过字符的编码大小来实现,有ASCII码(7位和8位二进制).Unicode码(16位):字符串的相等. 3.串不是线性表,因为串针对的是字符集,注重子串的查找替换等,线性表针对单个元素的操作. 4.串也分顺序存储结构和链式存储结构 5.朴素的模式匹配算法

Learning Data Structure_1_数据结构绪论和算法

今天回到了杭电,在戴荣学弟的帮助下暂住他的寝室,解决了基本的生活问题,可以多点时间精力开始学习阅读刘志老师给的暑假要求掌握的书籍和知识了. 首先是数据结构,手头上主要是两本教材,一本是严蔚敏等主编的<数据结构(c语言版)>,另一本是程杰编的<大话数据结构>,前者经典严谨,后者通俗有趣,应该是不错的选择.以下是简要的学习内容和笔记. 数据结构绪论 1.数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科. 2.掌握以下概念和术语:数据.数据

Learning Data Structure_2_线性表、栈和队列

一个人在学校的日子有些寂寞,但是st说男人要耐得住寂寞,做学问也是如此吧.今天看了线性表.栈和队列的内容.以下是学习记录. 线性表(list) 1.定义:0个或多个数据元素的有限序列,元素有且只有一个直接后继和一个直接前驱:基本操作ListLength.GetElem.LocateElem.ListInsert等,并集Union的实现. 2.线性表的顺序存储结构 指用一段地址连续的存储单元依次存储数据元素(c语言中用数组实现改结构):数组长度>=线性表的长度:对于任意位置的存入或取出的所需时间相

R8:Learning paths for Data Science[continuous updating…]

Comprehensive learning path – Data Science in Python Journey from a Python noob to a Kaggler on Python So, you want to become a data scientist or may be you are already one and want to expand your tool repository. You have landed at the right place.

【转】The most comprehensive Data Science learning plan for 2017

I joined Analytics Vidhya as an intern last summer. I had no clue what was in store for me. I had been following the blog for some time and liked the community, but did not know what to expect as an intern. The initial few days were good – all the in

python sort、sorted高级排序技巧

Python list内置sort()方法用来排序,也可以用python内置的全局sorted()方法来对可迭代的序列排序生成新的序列. 1)排序基础 简单的升序排序是非常容易的.只需要调用sorted()方法.它返回一个新的list,新的list的元素基于小于运算符(__lt__)来排序. 复制代码 代码如下: >>> sorted([5, 2, 3, 1, 4]) [1, 2, 3, 4, 5] 你也可以使用list.sort()方法来排序,此时list本身将被修改.通常此方法不如s

C#实现所有经典排序算法

C# 实现所有经典排序算法 1 .选择排序 选择排序 原理: 选择排序是从冒泡排序演化而来的,每一轮比较得出最小的那个值,然后依次和每轮比较的第一个值进行交换. 目的:按从小到大排序. 方法:假设存在数组:72, 54, 59, 30, 31, 78, 2, 77, 82, 72 第一轮依次比较相邻两个元素,将最小的一个元素的索引和值记录下来,然后和第一个元素进行交换. 如上面的数组中,首先比较的是72,54,记录比较小的索引是54的索引1.接着比较54和59,比较小的索引还是1.直到最后得到最