常用的排序算法

一、选择排序法

通过从待排序的数据中选择最小(最大)的值的方法进行的排序。

1.直接选择排序

定义:从index为0的位置开始,将当前位置的数据依次与剩余位置的数据进行比较,将值更小(更大)位置的数据与当前位置的数据进行交换。
特点:假设有n项数据,需要进行n-1轮比较,时间效率为O(n^2),空间效率为O(1),排序不稳定(不稳定是指两个相同的值在排序后相对位置可能会发生改变)。

2.堆排序

定义:从index为n-1的位置开始,将待排序序列(0~n-2)当做顺序存储的二叉树(即对于索引为k的节点,其左右子节点如果存在的话,索引分别为2k+1和2k+2),从最后一个非叶子节点(假设有n项数据,其最后一个非叶子节点的索引为 n-1/2)开始进行建小堆(大堆)操作(即对普通节点、普通节点的左、右子节点这三个位置的值进行比较,将值最小的节点与普通节点的位置进行交换),建堆完成后整个二叉树的根节点的值即为待排序数据中的最小(最大)值,将根节点的值与当前index位置的值进行交换,即选择出这组数中的最小(最大)值。
特点:假设有n项数据,需要进行n-1次建堆,时间效率为O(nlog2^n),空间效率为O(1),排序不稳定。

二、交换排序

通过对待排序的数据中的数据不断进行交换的方法进行的排序。

1.冒泡排序

定义:从index为0的位置开始,将当前位置的数据与相邻后一位的数据进行比较,将值更小(更大)的位置交换进行交换成后一位,交换至n-1后,最小(最大)值排到了最后。以此继续对剩余待排序数据(0~n-2)进行比较。
特点:假设有n项数据,需要进行n-1轮比较,时间效率为O(n^2),空间效率为O(1),排序稳定。

2.快速排序

定义:从index为0的位置开始,以当前值作为分界值对剩余数据进行归类,比当前值小(大)的数据划分到左边,将比当前值大(小)的数据划分到右边。然后分别对分界值左边和右边的数据进行快速排序,以此迭代。
特点:假设有n项数据,需要进行n-1轮比较,时间效率为O(log2n),空间效率为O(log2n),排序不稳定。

三、插入排序

通过将待排序的数据插入到已排序序列中的方法进行的排序。

1.直接插入排序

定义:从index为0的位置开始,通过遍历比较的方式确定插入位置,依次将待排序的数据元素按其值的大小插入前面的有序序列。
特点:假设有n项数据,需要进行n-1轮比较,时间效率为O(n^2),空间效率为O(1),排序稳定。

2.折半插入排序

定义:从index为0的位置开始,通过与有序序列1/2、1/4、1/8索引位置的值进行比较的方式确定插入位置,依次将待排序的数据元素插入前面的有序序列。
特点:假设有n项数据,需要进行n-1轮比较,时间效率为O(n^2),空间效率为O(1),排序稳定。效果与直接插入排序一致,只是占用的时间更少

3.Shell排序

定义:从index为0的位置开始,第一次按照间隔距离h(h <= n/3,h = 3 * h+1,例如1、4、13、40…)对相应索引位置的数据进行插入排序,后续按照 ( h −1)/3的缩小的距离对相应索引位置的数据进行插入排序,依此直到完成h=1的插入排序。
特点:假设有n项数据,时间效率为O(N3/2)~O(N7/6),空间效率为O(1),排序稳定。效果与直接插入排序一致,只是占用的时间更少

四、归(合)并排序

定义:先将长度为n的无序序列看成是n个长度为1的 有序子序列,首先做两两合并,得到 n/2 个长度为 2 的有序子序列,再对长度为2的序列做两两合并,依此类推,最终可以得到一个长度为n的有序序列。
特点:假设有n项数据,时间效率为O(nlog2n),空间效率为O(n),排序稳定。

五、桶式排序

定义:通过枚举法列出所有所有待排序的值,按照顺序存放在一个数组中。遍历待排序的序列,即可得到每个值存放的索引位置。按照索引重新排序即可得到有序序列。
特点:假设有n项数据,时间效率为O(n),空间效率为O(n),排序稳定。

五、基数排序

定义:通过将待排序数据拆分成多个关键字按照其他排序稳定的方法进行排序(例如按数字的个位、十位、百位上的数字,按照桶式排序进行比较)。
特点:一种排序方法的应用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值