排序算法
来源:互联网 发布:如何更换淘宝会员名 编辑:程序博客网 时间:2024/06/08 14:34
这两天看了一下有关排序算法的东西,稍微了解了比较常用的和常见的排序算法。
一.插入排序——直接插入排序
1.首先新建一个空列表,用于保存已排序的有序数列(我们称之为"有序列表")。
2.从原数列中取出一个数,将其插入"有序列表"中,使其仍旧保持有序状态。
3.重复2号步骤,直至原数列为空。
二.插入排序——希尔排序
先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。
1.选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;
2.按增量序列个数k,对序列进行k
3.每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m
三.选择排序——直接选择排序
在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。
四.选择排序——堆排序
堆排序是一种树形选择排序,是对直接选择排序的有效改进。堆可分为小顶堆和大顶堆(堆顶元素是最小或最大)。
1.设有m
2.将根结点与左、右子树中较小元素的进行交换。
3.若与左子树交换:如果左子树堆被破坏,即左子树的根结点不满足堆的性质,则重复方法
4.若与右子树交换,如果右子树堆被破坏,即右子树的根结点不满足堆的性质。则重复方法
5.继续对不满足堆性质的子树进行上述交换操作,直到叶子结点,堆被建成。
五.交换排序——冒泡排序
六.交换排序——快速排序
1.选择一个基准元素,通常选择第一个元素或者最后一个元素,
2.通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的
3.此时基准元素在其排好序后的正确位置
4.然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序
七.归并排序
归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。
设r[i…n]由两个有序子表r[i…m]和r[m+1…n]组成,两个子表长度分别为n-i
1.
2.
3.
如果r[i],rf[k]=r[i];
否则,rf[k]=r[j];
4.
如果i<=m,将r[i…m]存入rf[k…n]
如果j<=n
5.
八.基数排序
各种排序的稳定性,时间复杂度和空间复杂度总结
选择排序算法准则:
每种排序算法都各有优缺点。因此,在实用时需根据不同情况适当选用,甚至可以将多种方法结合起来使用。
选择排序算法的依据
影响排序的因素有很多,平均时间复杂度低的算法并不一定就是最优的。相反,有时平均时间复杂度高的算法可能更适合某些特殊情况。同时,选择算法时还得考虑它的可读性,以利于软件的维护。一般而言,需要考虑的因素有以下四点:
1.待排序的记录数目n的大小;
2.记录本身数据量的大小,也就是记录中除关键字外的其他信息量的大小;
3.关键字的结构及其分布情况;
4.对排序稳定性的要求。
设待排序元素的个数为n.
1)当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。
2)
3)当n较小,可采用直接插入或直接选择排序。
5)一般不使用或不直接使用传统的冒泡排序
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- EasyUI datagrid实现翻页保持选中状态
- C++:继承访问说明符
- mac终端配置gradle环境变量
- eclipse调试以及step into step over step return区别
- js实现导航菜单点击切换选中时高亮状态——方法二
- 排序算法
- SVN库迁移
- redis 参数优化
- 华为oj--整型数组合并
- 云时代的分布式数据库:阿里分布式数据库服务DRDS
- Docker学习笔记2: Docker 概述
- WebView 实现 NestedScrollingChild
- Kubernetes用户指南(三)--在生产环境中使用Pod来工作、管理部署
- BigDecimal(一)