AOP-Chap26-Sorting
Chap26 Sorting
- 1 O(N^2^) Sorts
- 1.1 Bubble Sort
- 1.2 Insertion Sort
- 1.3 Selection Sort
- 2 O(Nlg(N)) Sorts
- 2.1 Heap Sort
- 2.2 Merge Sort
- 2.3 Quick Sort
- 3 Sorting Tradeoffs
- 4 Sorting Libraries
1 O(N2) Sorts
1.1 Bubble Sort
- 遍历数组,将每个元素与其相邻的元素进行比较。如果两个元素的顺序不对,冒泡排序将交换它们。遍历数组使每个元素更接近其正确的位置,但是遍历数组一次不足以保证数组是完全排序的。因此,冒泡排序会重复这个过程,直到在数组中不交换任何元素为止
- 最大的元素迅速“冒出来”——第一次遍历数组将最大的元素移动到最后一个位置,然后接下来的每一次遍历确保至少下一个最大的元素被移动到正确的位置
- 小的元素向左挪会经过很多次,因为每次只能移动一个位置
- shaker sort 仍然是O(N2) --> 左到右(最大),右到左(最小),左到右(次最大)……
- 冒泡排序在链表上实现相对容易(交换的是节点中的数据,而不是节点本身)。它在链表上的效率并不比在数组上低——sort按顺序遍历数组的元素,并将一个元素与紧接着的后续元素进行比较。
- shaker sort只对双链表有用,以便反向传递可以跟随前一个指针。
1.2 Insertion Sort
- 将数组分成两部分——一部分是排序的,另一部分是未排序的。然后将未排序部分的第一个元素插入到已排序部分中相对于其他已排序元素的正确位置。该插入操作将数组中已排序的部分增加一个元素,同时收缩未排序的部分。当数组中未排序的部分完全缩小时,整个数组将被排序。
- 排序从排序部分和未排序部分之间的划分开始,这样排序部分只有一个元素,而未排序部分有N-1个元素
- 找到一个位置,将插入点右侧元素们向右移动以腾出空间,并将元素插入一个可能远离起始位置的位置。当算法正确地复制元素以准备插入时,将短暂地存在被移动项的副本。在算法的下一步中(将下一个元素右移或插入当前元素),复制的副本将被覆盖
- 更适合链表 --> 在算法的每一步中,删除原始list的头,并在新list中执行排序插入。可以重用原始节点,因此不需要任何额外的分配或复制
1.3 Selection Sort
- 找到未排序区域的最小元素,将该元素与未排序区域的第一个元素交换(除非它已经在该位置)。此时,已排序的区域会增长(而未排序的区域会收缩),这个过程会重复,直到整个数组都已排序
- 选择排序在链表上的效果并不比在数组上差,因为它按顺序遍历数据结构
2 O(Nlg(N)) Sorts
2.1 Heap Sort
- 重新使用选择排序,但用更有效的方法找到最小元素,O(lg(N))而不是O(N)
- 将数组中的所有项放入堆中,然后反复从堆中删除最大的元素,并将其放入数组中正确的位置。将从右到左输入最大元素,所以我们使用max堆表示升序,使用min堆表示降序。
- 堆实际上是作为数组实现的。因此,可以将数组分成无序数组和堆有序数组两部分。然后,可以采用类似的方法,通过将下一个元素插入到堆中来移动区域之间的边界,O(lg(N) --> heapify --> 总共O(Nlg(N))
- 堆放在左边,数组放在右边,heap中最大元素index为0
- 需要把heap中最大元素放在整个数组的右端——堆和排序数组之间的边界处。堆移除操作恰好这么做。因此,交换数组的第0个元素(即堆的顶部)和堆中的最后一个元素。这个交换操作将排序区域扩展了一个元素,并以正确的方式从堆中开始删除操作——只需要将节点向下bubble到其正确的位置(O(lg(N))。在我们完成将元素向下冒泡之后,重复以上过程,直到堆消失且整个数组都已排序
2.2 Merge Sort
- 归并排序是一种divide and conquer分治算法,通过递归处理问题的较小部分(divide),然后得到递归的结果(conquer)。对数组的左半部分进行拆分和递归排序,然后对数组的右半部分进行递归排序,然后执行合并操作,将两个已排序数组的结果合并在一起
- merge操作遍历数组的两个排序区域,取下一个元素最小的子数组中的元素。将选定的元素写入临时数组。重复进行,直到一个子数组为空。此时,剩下的元素从另一半复制到临时空间,然后整个临时空间(现在已经排序)被写回数组
- 不适合小数组
- 这里使用 n<=2作为base case
再写回
2.3 Quick Sort
- typically O(Nlg(N)) 大约分为一半一半, worst case O(N2) very imbalance
- 首先将数组划分为smaller and larger elements,然后递归排序这些部分。分区是针对一个叫做主元pivot的元素进行的
- 选择pivot, 数组所有小于pivot的元素左边, 大于pivot在右边,swap the pivot into its proper position,然后递归地快速排序左右两个分区
- 分区算法并没有尝试对每一半中的元素彼此进行正确的排序,它只将比pivot小的放左边,比pivot大的放右边
- 选择pivot(中间值最好)
- 对random data选择最后一个元素
- 选择一个ramdom array index并使用该元素作为主元素,通过随机选择三个index,并选择这三个要素的中位数,来提高良好枢轴的几率
- pivot被选择并交换到最后,分区步骤首先从左到右扫描,寻找数组中比主元大的元素(即属于右边)。然后从右到左扫描,寻找小于主元(即属于左侧)的元素。一旦找到这两个元素,互相交换,将它们放在数组的正确一侧。然后,该过程在另一次左扫描/右扫描中重复,并在两个扫描相互交叉时结束(这在从右向左扫描停止后进行检查)。当扫描结束时,从左到右的扫描索引位于要放置主元素的正确位置,因此它所指向的元素与主元素交换,递归排序左右两边
3 Sorting Tradeoffs
- introspection sort内省排序 --> 混合快速排序和堆排序。从快速排序开始,但如果快速排序的递归深度超过了正比于lg(N)的数(例如2lg(N))的限制,则切换到堆排序。快速排序需要一个额外的参数,该参数指定在切换到堆排序之前可以进行多少递归调用深度。当该参数达到0时,修改后的快速排序调用堆排序并返回。当快速排序递归时,它会使当前的limit - 1
4 Sorting Libraries
- C library --> qsort 快排
void qsort(void * base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
- C++ ,STL中有std::sort, 对任何支持iterator(如vector)的container的元素进行排序,默认ascending order,也可以自定义排序
http://www.cplusplus.com/reference/algorithm/sort/ - 对于equality of items,std::stable_sort
http://www.cplusplus.com/reference/algorithm/stable_sort/
AOP-Chap26-Sorting相关推荐
- 简单两步,spring aop上手即用即会
面向切面思想在于它的干净,对逻辑代码没有任何侵入性,只需要在想要切入的方法或者类之上加上自定义的注解即可. 首先,就是自定义一个注解: //这里我们定义一个名为 @MyPointer 的注解 @Doc ...
- Spring AOP + Redis解决重复提交的问题
Spring AOP + Redis解决重复提交的问题 用户在点击操作的时候,可能会连续点击多次,虽然前端可以通过设置按钮的disable的属性来控制按钮不可连续点击,但是如果别人拿到请求进行模拟,依 ...
- 【Spring】面向切面编程AOP
AOP基础 什么是AOP [废话解释]在软件业,AOP全称Aspect Oriented Programming 即:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AO ...
- SpringBoot集成AOP管理日志
写在前面 如何将所有的通过url的请求参数以及返回结果都输出到日志中? 如果在controller的类中每个方法名都写一个log输出肯定是不明智的选择.使用Spring的AOP功能即可完成. AOP ...
- 利用Spring AOP与JAVA注解为系统增加日志功能
Spring AOP一直是Spring的一个比较有特色的功能,利用它可以在现有的代码的任何地方,嵌入我们所想的逻辑功能,并且不需要改变我们现有的代码结构. 鉴于此,现在的系统已经完成了所有的功能的开发 ...
- Spring.Net Aop
Spring.Net 有四种通知: IMethodBeforeAdvice,IAfterReturningAdvice,IMethodInterceptor,IThrowsAdvice BeforeA ...
- Spring AOP的一些概念
切面(Aspect): 一个关注点的模块化,这个关注点可能会横切多个对象.事务管理是J2EE应用中一个关于横切关注点的很好的例子. 在Spring AOP中,切面可以使用通用类(基于模 ...
- (一)七种AOP实现方法
在这里列表了我想到的在你的应用程序中加入AOP支持的所有方法.这里最主要的焦点是拦截,因为一旦有了拦截其它的事情都是细节. Approach 方法 Advantages 优点 Disadvantage ...
- Spring框架系列之AOP思想
微信公众号:compassblog 欢迎关注.转发,互相学习,共同进步! 有任何问题,请后台留言联系! 1.AOP概述 (1).什么是 AOP AOP 为 Aspect Oriented Progra ...
最新文章
- 皮一皮:叛徒可耻!!!
- oracle11g安装到第7步,centos7安装oracle11g到这一步卡在了?也没有安装界面
- python3软件怎么用_Python3学习之路~4.4 软件目录结构规范
- Android studio使用手册说明
- ios 消息服务器,关于IOS APNS推送消息(iphone端+服务端)
- 小程序 || 语句_C ++条件语句| 查找输出程序| 套装1
- MySql数据同步(双机热备)已正式应用上平台
- 又发现一款牛逼的 API 敏捷开发工具
- [小功能]禁用模板默认CSS
- dll和so文件区别与构成
- 在plc中用c语言实现电梯控制程序,基于PLC的电梯控制系统的设计与实现[论文+答辩ppt+完整程序代码]...
- 肥宅快乐还是不快乐,拓展欧几里得,exgcd???bfs
- Excel(WPS)使用VBA,不打开文件情况下提取其他工作簿数据
- Flatten()详解
- 如何在邮件中嵌入 加入QQ群的按钮
- 国标GB28181协议视频智能分析平台EasyCVR,构建智慧企业AR云景解决方案
- Navicat for Mysql建立本地连接出现 1044或1045的问题并如何解决。
- 用js实现点击切换+自动切换的轮播图
- 免root运行青龙面版和傻妞机器
- (期末考试prepare)放大电路静态工作点及微变等效电路问题实例求解