直接选择排序到堆排序做的那些改进

1 你会学到什么?

彻底弄明白常用的排序算法的基本思想,算法的时间和空间复杂度,以及如何选择这些排序算法,确定要解决的问题的最佳排序算法,上个推送总结了冒泡排序和其改进后的快速排序这两个算法,下面总结直接选择排序到堆排序的改进,后面再继续总结插入排序、希尔排序、归并排序和基数排序。

2 讨论的问题是什么?

各种排序算法的基本思想;讨论各种排序算法的时间、空间复杂度;以及算法的稳定性;算法是如何改进的,比如冒泡排序如何改进成了目前最常用的快速排序的,直接选择排序到堆排序的改进,正是接下来要讨论的对象。

3 相关的概念和理论

内部排序
若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序。

外部排序
若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序。

就地排序
若排序算法所需的辅助空间并不依赖于问题的规模n,即辅助空间为O(1),称为就地排序。

稳定排序
假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序后,这些记录的相对次序保持不变,即在原序列中 ri=rj, ri 在 rj 之前,而在排序后的序列中,ri 仍在 rj 之前,则称这种排序算法是稳定的;否则称为不稳定的。

排序序列分布
排序需要考虑待排序关键字的分布情况,这会影响对排序算法的选择,通常我们在分析下列算法时都考虑关键字分布是随机分布的,不是按照某种规律分布的,比如正态分布等。

待排序序列
排序序列中,剩余即将要排序的序列部分。

已排序序列
排序序列中,已经排序好的序列部分。

4 直接选择排序

直接选择排序,英文名称 :Straight Select Sorting,是一个直接从未排序序列选择最值到已排序序列的过程。

基本思想

第一次从R[0]~R[n-1]中选取最小值,与R[0]交换;
第二次从R[1]~R[n-1]中选取最小值,与R[1]交换,….,
第 i 次从R[i-1]~R[n-1]中选取最小值,与R[i-1]交换,…..,
总共通过n-1次,得到一个按关键码从小到大排列的有序序列。

升序排序的例子

我们仍然用上节冒泡排序和快速排序举的例子。待排序列
3 2 5 9 2

演示如何用直接选择排序得到升序序列。
第一轮,从所有关键码中选择最小值与 R[0]交换,3与2交换,如下图所示,


这里写图片描述
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 直接插入排序:将待排序的元素插入到已排序序列中的合适位置,从而得到新的有序序列。具体实现时,从第2个元素开始,逐个将元素插入到前面已经排序好的序列中,直到全部插入完成。 举例:对于数组 [5, 2, 4, 6, 1, 3] 进行直接插入排序,具体步骤如下: 1. 第一次插入排序:[2, 5, 4, 6, 1, 3] 2. 第二次插入排序:[2, 4, 5, 6, 1, 3] 3. 第三次插入排序:[2, 4, 5, 6, 1, 3] 4. 第四次插入排序:[2, 4, 5, 6, 1, 3] 5. 第五次插入排序:[1, 2, 4, 5, 6, 3] 6. 第六次插入排序:[1, 2, 3, 4, 5, 6] 2. 折半插入排序:在直接插入排序的基础上,采用二分查找的方式寻找插入位置,从而减少比较次数。 举例:对于数组 [5, 2, 4, 6, 1, 3] 进行折半插入排序,具体步骤如下: 1. 第一次插入排序:[2, 5, 4, 6, 1, 3] 2. 第二次插入排序:[2, 4, 5, 6, 1, 3] 3. 第三次插入排序:[2, 4, 5, 6, 1, 3] 4. 第四次插入排序:[2, 4, 5, 6, 1, 3] 5. 第五次插入排序:[1, 2, 4, 5, 6, 3] 6. 第六次插入排序:[1, 2, 3, 4, 5, 6] 3. 希尔排序:是插入排序的一种改进,通过将待排序元素分组,对每组进行插入排序,从而缩小了比较的范围。 举例:对于数组 [5, 2, 4, 6, 1, 3] 进行希尔排序,具体步骤如下: 1. 第一次分组排序:[1, 2, 4, 3, 5, 6] 2. 第二次分组排序:[1, 2, 3, 4, 5, 6] 4. 冒泡排序:通过比较相邻两个元素的大小,将较大的元素向后移动,从而得到逐渐有序的序列。 举例:对于数组 [5, 2, 4, 6, 1, 3] 进行冒泡排序,具体步骤如下: 1. 第一次冒泡排序:[2, 4, 5, 1, 3, 6] 2. 第二次冒泡排序:[2, 4, 1, 3, 5, 6] 3. 第三次冒泡排序:[2, 1, 3, 4, 5, 6] 4. 第四次冒泡排序:[1, 2, 3, 4, 5, 6] 5. 快速排序:通过选定一个基准值,将待排序序列划分为左右两部分,在左半部分中找出比基准值大的元素,右半部分中找出比基准值小的元素,然后交换这两个元素的位置,最终将序列划分为两个子序列,分别对左右两部分进行递归排序。 举例:对于数组 [5, 2, 4, 6, 1, 3] 进行快速排序,具体步骤如下: 1. 第一次快速排序:[3, 2, 4, 1, 5, 6] 2. 第二次快速排序:[1, 2, 3, 4, 5, 6] 6. 简单选择排序:从待排序序列中选择最小的元素,放到已排序序列的末尾,从而得到逐渐有序的序列。 举例:对于数组 [5, 2, 4, 6, 1, 3] 进行简单选择排序,具体步骤如下: 1. 第一次选择排序:[1, 2, 4, 6, 5, 3] 2. 第二次选择排序:[1, 2, 4, 6, 5, 3] 3. 第三次选择排序:[1, 2, 3, 6, 5, 4] 4. 第四次选择排序:[1, 2, 3, 4, 5, 6] 7. 堆排序:通过将待排序序列建立成一个堆,依次将堆顶元素取出并放到已排序序列的末尾,从而得到逐渐有序的序列。 举例:对于数组 [5, 2, 4, 6, 1, 3] 进行堆排序,具体步骤如下: 1. 第一次堆排序:[4, 2, 3, 6, 1, 5] 2. 第二次堆排序:[3, 2, 1, 6, 4, 5] 3. 第三次堆排序:[2, 1, 3, 6, 4, 5] 4. 第四次堆排序:[1, 2, 3, 6, 4, 5] 5. 第五次堆排序:[1, 2, 3, 5, 4, 6] 6. 第六次堆排序:[1, 2, 3, 4, 5, 6] 8. 二路归并排序:将待排序序列分成两个部分,对每个部分进行递归排序,然后再将排好序的两个部分合并成一个有序序列。 举例:对于数组 [5, 2, 4, 6, 1, 3] 进行二路归并排序,具体步骤如下: 1. 第一次归并排序:[2, 5, 4, 6, 1, 3] 2. 第二次归并排序:[2, 4, 5, 6, 1, 3] 3. 第三次归并排序:[1, 2, 3, 4, 5, 6]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值