数据结构-排序算法的总结

1.排序的基本概念

1.1排序:按照一定的关键字,将一个序列排列成想要得到的一个新的序列。

1.2内部排序与外部排序:

1.2.1内部排序:整个排序过程完全在内存中进行。

1.2.2外部排序:由于待排序记录数据量太大,内存无法容纳全部数据,排序需要借助外部存储才能完成。

2 .插入类排序

2.1直接插入排序:

2.1.1思想:最基本的插入排序,将第i个插入到前i-1个中的适当位置。

2.1.2时间复杂度:T(n)=O(n²)

2.1.3空间复杂度:S(n)=O(1)

2.1.4稳定性:稳定排序。

2.2折半插入排序

2.2.1思想:因为是已经确定了前部分是有序序列,所以在查找插入位置的时候可以用折半查找的方法进行查找,提高效率。

2.2.2时间复杂度:T(n)=O(nn)。

2.2.3空间复杂度:S(n)=O(1)

2.2.4稳定性:稳定排序。

2.2.5改进思路:改进了确定插入位置方法:利用折半思想确定在有序表中的插入位置。

2.3希尔排序

2.3.1思想:希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

2.3.2时间复杂度:T(n)=O(n的1.5次方)

2.3.3空间复杂度:S(n)=O(1)。

2.3.4稳定性:不稳定排序。

2.3.5改进思路:利用直接插入的最好情况:n比较小,基本有序。

3.交换类排序

3.1冒泡排序

3.1.1思想:它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

3.1.2时间复杂度:T(n)=O(n²)。

3.1.3空间复杂度:S(n)=O(1)。

3.1.4稳定性:稳定排序。

3.2快速排序

3.2.1思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

3.2.2时间复杂度:T(n)=O(nn) 最坏打算为O(n²)

3.2.3空间复杂度:S(n)=O(n)

3.2.4稳定性:不稳定排序。

4.选择类排序

4.1简单选择排序

4.1.1思想:设所排序序列的记录个数为n。i取1,2,…,n-1,从所有n-i+1个记录(Ri,Ri+1,…,Rn)中找出排序码最小的记录,与第i个记录交换。执行n-1趟 后就完成了记录序列的排序。

4.1.2时间复杂度:T(n)=O(n²)

4.1.3空间复杂度:S(n)=O(1)

4.1.4稳定性:不稳定排序。

4.1.5改进思路:基本排序方法。

4.2堆排序

4.2.1思想:把待排序记录的关键字存放在数组r[1…n]中,将r看成是一刻完全二叉树的顺序表示,每个节点表示一个记录,第一个记录r[1]作为二叉树的根,一下个记录r[2…n]依次逐层从左到右顺序排列,任意节点r[i]的左孩子是r[2i],右孩子是r[2i+1],双亲是r[i/2向下取整]。然后对这棵完全二叉树进行调整建堆。

4.2.2时间复杂度:T(n)=O(nn)

4.2.3空间复杂度:S(n)=O(1)

4.2.4稳定性:不稳定排序。

4.2.5堆的建立:从无序序列建堆的过程就是一个反复调整的过程。若将此序列看成是一个完全二叉树,则最后一个非终端结点是第(n-2)/2个结点,由此调整过程只需从该结点开始,直到堆顶元素。

4.2.6堆的删除:堆中每次都只能删除堆顶元素。为了便于重建堆,实际的操作是将最后一个数据的值赋给根结点,然后再从根结点开始进行一次从上向下的调整。调整时先在左右子结点中找最小的,如果父结点比这个最小的子结点还小说明不需要调整了,反之将父结点和它交换后再考虑后面的结点。相当于根结点数据的“下沉”过程。

4.2.7改进方法:讲存储在向量中的数据元素看成一棵完全二叉树,减少辅助空间。

5.归并排序

5.1思想:基于合并,讲两个或者两个以上有序表合并成一个新的有序表。

5.2时间复杂度:T(n)=O(n㏒n)。

5.3空间复杂度:S(n)=O(n)。

5.4稳定性:稳定排序。

6.分配类排序

6.1链式基数排序

6.1.1思想:先分配,再收集,就是先按照一个次关键字收集一下,然后进行收集(第一个排序),然后再换一个关键字把新序列分配一下,然后再收集起来,又完成一次排序,这样所有关键字分配收集完后,就完成了排序。

6.1.2时间复杂度:T(n)=O(d(n+rd))。

6.1.3空间复杂度:S(n)=O(rd)

6.1.4稳定性:稳定排序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值