排序算法之选择,插入,基数,归并,交换排序

排序算法

1.归并排序

1.将多个有序表多次合成,是之成为一个有序表的过程

2.两两归并,直到合成一个完整的有序表

3.代码实现

4.时间复杂度O( n l o g 2 n nlog_{2}n nlog2n),空间复杂度O(n).

2.基数排序

1.确定基数r,二进制则基数是2,十进制则基数是十。

2.基数排序两种方法:最低为优先(LSD)和最高位优先(MSD)。

3.操作过程总结起来就是分配和收集。具体过程(LSD):1.创建r个队列,f代表队头,r代表队尾,并且每个队列分别代表0r-1,表头和表尾记录0r-1;2.分配,第一次分配从最低位开始,根据该位的数字将关键字放入队列中;收集,所有关键字都分配完毕,将队列从大到小或从小到大首尾依次相连。3.每一位都这样操作。

4.时间复杂度O(d(n+r));空间复杂度O®。

3.选择排序

1.简单选择排序(直接选择排序)
2.堆排序

简单选择排序(直接选择排序)

1.它和冒泡法还是有区别的。冒泡法属于是交换排序,它的位置交换的次数比简单选择排序要多很多。

2.时间复杂度O( n 2 n^2 n2);空间复杂度O(1)。

堆排序

1.堆分为大根堆和小根堆:根结点关键字大于孩子则是大根堆,小于孩子则是小根堆。先综述一下堆排序如何实现排序。(大根堆为例),因为构造好了大根堆,那么根节点一定是最大的,我们把根节点移到最后,再将最后的提前,然后筛选继续构造堆。

2.无论大根堆还是小根堆都是在隐形的,结点中并没有指针来指向孩子结点,而是利用函数来确定某节点的左右孩子结点,而这个函数就是:某节点的序号是i,则他的孩子结点的序号分别是2i和2i+1。

3.所以,据前面可知,利用堆排序,最主要是构建出大根堆或是小根堆。这里将构造堆的算法叫做筛选(sift) 好像筛子一样将小的节点筛下去

4.时间复杂度O( n l o g 2 n nlog_{2}n nlog2n),空间复杂度是O(1)。且不稳定

5.不稳定的意思是:在排序的过程中,关键字完全相同的节点的相对位置会改变。

4.交换排序

1.冒泡法
2.快速排序

冒泡法

1.从尾开始两两比较比较到有序区的尾。

2.改进的冒泡法:设置一个变量exchange,bool型,一旦某一趟完全没出现交换操作,就可以提前结束排序。

3.最坏时间复杂度O( n 2 n^{2} n2)(反序时),最好的时间复杂度O(n)。

快速排序

1.选定开头的关键字作为基准,将大于它的放在他的后面,小于它的放在前面。

2.最好的时间复杂度O( n 2 n^{2} n2)最坏O( n l o g 2 n nlog_{2}n nlog2n).空间复杂度最坏O(n),最好O( l o g 2 n log_{2}n log2n).

5.插入排序

1.直接插入排序

2.折半插入排序

3.希尔排序

####直接插入排序

1.将序列分为有序区和无序区。每次将无序区最前面的元素挨个和有序区元素作比较(从后往前),直至合适的位置。

2.时间复杂度:最好O(n);最坏O( n 2 n^{2} n2).

折半插入排序

1.在有序区采用折半查找法,找到待加入的元素的合适的位置。

2.时间复杂度o( n 2 n^{2} n2).(查找的时间变短了但是移动的次数不变)。

希尔排序

1.分组,组内排序,结束标志是组数为1.

2.时间复杂度o( n 1.3 n^{1.3} n1.3).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱总结的人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值