排序总结

1.冒泡排序

算法思想先从数组的第一个元素开始,一次比较相邻的两个元素,若前者比后者大则交换两个数的位置,然后处理下一对,依次类推,不断处理数组;
时间复杂度:O(n^2)
空间复杂度: O(1)
算法特点:稳定排序
      可用于链式存储结构
      当初始记录无序 n较大时不适合采用。

2.选择排序:

线性逐一扫描数组中的元素,从中挑出最小的元素将其插入已经排好序的序列中,再次从未排序列中选出最小的元素插入到已经有序序列的末尾。

时间复杂度:O(n^2)
空间复杂度:O(1)
算法特点: 由于该算法中存在<待排序列最小记录>与<有序序列后面第一个元素>的交换,所以是不稳定的排序;
  无论记录的初始状态时什么样的,每一次为了从待排序列中选出当前的最小元素,所比较的次数是相同的。
  可以用于链式存储结构。
  该算法的移动记录的次数较少,所以适合用于移动代价较大的情况。

3.1插入排序之直接插入:

逐个将数组中的数据插入到有序表中
时间复杂度:O(n^2)
空间复杂度:O(1)
算法特点:稳定排序;
      当记录无序,n较大的时候,该算法的复杂度较高。

3.2插入排序之折半插入

将数据插入到有序表中的时候采用二分查找的方式确定新来元素在有序表中的位置。
时间复杂度:仍为O(n^2),因为记录移动的次数不变。
空间复杂度:O(1)
算法特点:稳定排序;
      只能用顺序存储;
      适用于初始记录无序,n较大的情况;

4.MergeSort

将待排序列中前后相邻的两个有序序列归并为一个有序序列。
1) 时间复杂度:对于n个记录需要递归调用Log2n次,关键字比较次数不超过n,所以时间复杂度是O(Log2n)
2)空间复杂度:数组实现时需要需要创建更大的新数组来存储合并后的两个子表。递归调用需要和待排记录相等的存储空间O(n)。链表实现时不需要额外的存储空间,但需要开辟递归工作栈。
3)算法特点:稳定排序,

5.QuickSort

随即挑选一个元素对数组进行分割 ,将所有比它小的元素放到前面,所有比它大的元素放到后面。
1.时间复杂度分析:
最好情况:每一趟排序后都能将记录序列均能分割成长度大致相等两个子表(递归树是一棵完全二叉树),n个元素的序列中对枢轴的定位代价为O(n),此时进行log2n次递归调用,所以总的时间代价为O(nlogn)
最坏情况:在已经排好序的情况下(每次取第一个元素为枢轴时),递归树是一棵单支树,退化为简单排序O(n)。
空间复杂度:

额外的存储空间用来保存枢轴,空间复杂度与递归深度相等

最好情况:O(log2n)
最坏情况:O(n)
算法特点:记录非顺序的移动,导致排序是不稳定的;
       适用于待排记录顺序存储,很难用于链式存储;
       适合于n较大而且初始记录无序的情况

6.基数排序

基于整数的排序算法,排序时迭代访问整数每一位,根据各位的值进行分组,直到整个数组变有序数组
时间复杂度:设n个记录每个记录含有d位每位的取值范围是r,需要进行d趟分配,每趟分配的时间复杂度为O(n),收集的时间复杂度为O(rd);总的时间复杂度为O(d(n+rd).
空间复杂度:辅助空间是2rd个队列指针,增加了n个指针域空间,所以时间复杂度为O(n+rd).

7.希尔排序

本质上采用分组插入的方法,先将待排序列进行分组,(减少参与直接插入排序的元素数量),对每组进行直接插入排序,重新分组,直到分组增量为1.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值