各个排序算法(^_^)
排序图表:
一、插入排序
每次将一个待排序的数据,跟前面已经有序的序列的数字一一比较找到自己合适的位置,插入到序列中,直到全部数据插入完成。
二、希尔排序
先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。由于希尔排序是对相隔若干距离的数据进行直接插入排序,因此可以形象的称希尔排序为“跳着插”
三、冒泡排序
通过交换使相邻的两个数变成小数在前大数在后,这样每次遍历后,最大的数就“沉”到最后面了。重复N次即可以使数组有序。
冒泡排序改进1:在某次遍历中如果没有数据交换,说明整个数组已经有序。因此通过设置标志位来记录此次遍历有无数据交换就可以判断是否要继续循环。
冒泡排序改进2:记录某次遍历时最后发生数据交换的位置,这个位置之后的数据显然已经有序了。因此通过记录最后发生数据交换的位置就可以确定下次循环的范围了。
四、快速排序
“挖坑填数+分治法”,首先令i =L; j = R; 将a[i]挖出形成第一个坑,称a[i]为基准数。然后j–由后向前找比基准数小的数,找到后挖出此数填入前一个坑a[i]中,再i++由前向后找比基准数大的数,找到后也挖出此数填到前一个坑a[j]中。重复进行这种“挖坑填数”直到i==j。再将基准数填入a[i]中,这样i之前的数都比基准数小,i之后的数都比基准数大。因此将数组分成二部分再分别重复上述步骤就完成了排序。
五、选择排序
数组分成有序区和无序区,初始时整个数组都是无序区,然后每次从无序区选一个最小的元素直接放到有序区的最后,直到整个数组变有序区。
六、堆排序
图:
堆的插入就是——每次插入都是将新数据放在数组最后,而从这个新数据的父结点到根结点必定是一个有序的数列,因此只要将这个新数据插入到这个有序数列中即可。
堆的删除就是——堆的删除就是将最后一个数据的值赋给根结点,然后再从根结点开始进行一次从上向下的调整。调整时先在左右儿子结点中找最小的,如果父结点比这个最小的子结点还小说明不需要调整了,反之将父结点和它交换后再考虑后面的结点。相当于从根结点开始将一个数据在有序数列中进行“下沉”。
因此,堆的插入和删除非常类似直接插入排序,只不是在二叉树上进行插入过程。所以可以将堆排序形容为“树上插”
七、归并排序
归并排序主要分为两步:分数列(divide),每次把数列一分为二,然后分到只有两个元素的小数列;合数列(Merge),合并两个已经内部有序的子序列,直至所有数字有序。用递归可以实现。
八、基数排序(桶排序)
基数排序,第一步根据数字的个位分配到每个桶里,在桶内部排序,然后将数字再输出(串起来);然后根据十位分桶,继续排序,再串起来。直至所有位被比较完,所有数字已经有序。
辅助空间
- 对n个记录的文件进行快速排序,所需要的辅助存储空间大致为 O(1og2n)O(1og2n)O(1og2n)
- 所有的简单排序方法(包括:直接插入、起泡和简单选择)和堆排序的空间复杂度为O(1);
- 快速排序为O(logn)O(logn )O(logn),为栈所需的辅助空间;
- 归并排序所需辅助空间最多,其空间复杂度为O(n)O(n )O(n);
- 链式基数排序需附设队列首尾指针,则空间复杂度为O(rd)O(rd )O(rd)。
谢谢!!!(^ — ^)
最新文章
- vc6.0打开工程出现程序崩了的原因
- php无符号整数转有符号整数,PHP中把有符号整型转换为无符号整型方法_PHP教程...
- angular2 路由ajax,如何通过Javascript函数在Angular 2中实现AJAX
- 一题多解(七)—— 取两数的最大值
- xpath抓取html不完全,scrapy的xpath是否取HTML标签的情况分析
- 机器学习框架_机器学习中的概率框架
- Python全局解释锁
- neo4j图数据库导入scv文件
- 思科路由器配置命令大全
- 案例:微博传播引爆点
- python使用win32和flask实现接收请求发送QQ消息
- Scrapy框架整合英雄缩略图(APP)
- python文件后缀切割_python如何去除文件后缀
- 原理探究:Spring @Value注解详解
- Unity接入ChatGPT基于Python.Runtime的实现
- Oracle19c的安装配置教程
- 2019最新Android常用开源库总结(持续更新,建议收藏)
- MySQL实战45讲学习笔记
- org.hibernate.ObjectNotFoundException
- 众美集团携手行业伙伴 聚焦城镇创新与城市更新