数据结构复习8.Sort

一. Bubble Sort

主要思路:从最开始两个数开始选定,依次两两比较,若是大就交换。直到完成L-1次的排序。

方法:

外层从最末位循环到1(只剩最后一个时不用排序)。

内层从0循环到out - 1(因为比较时in + 1,会到达out),如果前位data[in]比后位data[in + 1]大则交换。每次内层循环过后,循环经过部分最后一位已经排好。

时间复杂度O(n ^ 2) ,其中比较约n^2/2,swap约n^2/4

二. Selection Sort

主要思路:找当前位及之后的最小值,与当前位交换。

方法:

外层从0到最末位-1(最后一个)。

内层循环前首先记录最小值索引min(默认为此时外层索引out),然后从out + 1到最末尾做遍历更新min。如遍历结束后min不是out,则与out位交换。

每次循环后out位,即内层循环的前一位,是已经被排序的。

时间复杂度O(n ^ 2) ,其中比较约n^2/2,swap约n/2

三. Insertion Sort

主要思路:把当前元素插入前面排好顺序序列的合适位置(从后开始,因为需要位移比当前数大的数,这样不会花费额外的时间遍历)。

方法:

外层从1到最末位。

内层循环前首先将外层out对应的值存入tmp,然后从out 开始遍历,如果值大于tmp则向后移,直到in为0或值小于tmp,将tmp插入(out == in则不需移动)。

每次循环后,out位,即内层循环的后一位,已被排序。

时间复杂度O(n ^ 2) ,其中比较约n^2/4,没有swap只有shift

在近似已排序数组时,时间复杂度接近O(n)

四. Merge Sort

主要思路:部分有序到整体有序。即从两两有序,到四四有序,到八八有序……将无序数组排序变成多次的“两个有序数组的按顺序合并”

可递归实现,也可不通过递归实现。可以不占用新空间,也可占用新空间。

方法:

(1)递归实现(重点)

先对左右两个数组分别排序一次(每一个排序是对左右数组的一半再分别排序,通过merge合并,直到分成长为1的数组),再通过一次merge合并到一起。

merge时需注意,半个子数组遍历完成后不要忘记将另半个子数组最后的部分拷贝到目标(或暂存)数组里。

(2)非递归实现

先分成长度为二的段,merge排序。再分成长度为4的段,merge一次。直到长度为数组长。

时间复杂度为O(nlogn),其中每次merge复杂度为O(n),共需进行O(logn)次的归并


原地merge可以参考链接:

http://blog.csdn.net/acaiwlj/article/details/10948035


五. Quick Sort

主要思路:整体有序到部分有序。选定一个数,把比它大的放在它左边,比它小的放在它右边,然后再排左右两个子序列。其中放置过程是左边找到一个大数,右边找到一个小数,交换,直到左右指针重合或覆盖,插入。

方法:预先选定一个枢纽参考值pivot value,这个值通常是最后一位(也可以是其它任何数,比如中间位,中间几位的平均,随机数等)。

外层递归方法将pivot值通过内层方法插入的位置,再将插入位置的左右两边分别传入此递归方法中进行排序,直到排序数列长度为1.

内层划分方法,分别从左边开始找大于pivot的数、从右边找小于pivot的数,如果此时左右查询位置尚且不重合,则左右互换,保证插入点左边均小于pivot,右边均大于pivot。如果左右指针交叉,则说明已经找到了插入点,插入pivot值即可。

(也可以将两层合并到一个递归方法中写,思想相同)

快速排序法平均时间复杂度为O(nlogn),可是最坏的情况下的排序时间为O(n^2)此时近似于找到的每一个pivot都是待排序数组中的极值。

不过quick仍然时平均时间最快的比较排序算法。(非比较排序算法待补充)

六. Heap Sort

优先队列priority queue的实现原理(min heap)。优先队列不可以实现按指定顺序遍历,因为其基于heap。

1.max heap

特点:近似完全树、每一个节点的孩子均小于这个节点(根节点最大)

2. insert

插入新节点时,先保证近似完全树(即插到最底层最后一个位置),再将它与父节点调换(如果小于父节点则完成,如果调换后仍大于新父节点则再调换),直到成为max heap。

3.delete max

用最后一个节点替换根节点保证完全树,再与其子节点比较、调换,直到成为max heap

4. 实现heap sort

通过将数据插入insert得到我们的max heap,再观察同时删除最大节点,我们可以实现排序。


因为是近似完全树,所以我们可以用表的形式储存树,从而节省指针所需要的空间。即我们的node class没有指针field,只有value。需要注意的是,要判断当前数组最大长度和当前树中节点的个数,如果数组空间已满则不能再插入。

我们可以发现给定index位置的节点,则:

左孩子 lc = (index * 2) + 1

右孩子 rc = (index + 1)* 2= lc + 1

父亲 parent = (index - 1)/2

最后一个有孩子(左孩子)的节点 lastP = currentSize / 2

insert可实现如下:

deleteMax可实现如下:

时间复杂度O(nlogn), 其中insert和delete的复杂度为O(logn), 需要插入/取出n次。

5.priorityqueue

常用方法:add/offer(obj),contains(obj), poll(obj), peek(), size(), toArray(), remove(obj), 

PriorityQueue(int initialCapacity, Comparator<? super E> comparator)

Creates a  PriorityQueue with the specified initial capacity that orders its elements according to the specified comparator.

七. 总结

                          最快         平均          最慢                稳定性

冒泡排序          O(n)          O(n^2)      O(n^2)                稳定

选择排序        O(n^2)        O(n^2)      O(n^2)             不稳定

插入排序          O(n)          O(n^2)      O(n^2)                稳定

merge排序    O(nlogn)    O(nlogn)   O(nlogn)                稳定

快速排序      O(nlogn)    O(nlogn)     O(n^2)              不稳定

堆排序          O(nlogn)    O(nlogn)   O(nlogn)             不稳定

(其中冒泡排序的最快实现需对上面的程序进行优化。用一个flag记录循环中有无swap,在无swap的情况下直接跳出循环)


表格可参见 http://blog.chinaunix.net/uid-21457204-id-3060260.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值