插入排序--折半插入排序(来一来,看一看,走过路过,不要错过)

这篇具有很好参考价值的文章主要介绍了插入排序--折半插入排序(来一来,看一看,走过路过,不要错过)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  人生没有彩排,每天都是现场直播,不仅收视率低,而且工资不高。



一.前言

  插入排序根据查找插入位置的方式不同可以分为三类:按顺序法查找插入位置的——直接插入排序;按折半法也叫二分法查找插入位置的——折半插入排序;缩小增量多遍插入排序的——希尔排序。本文探讨有关折半插入排序的知识。


二.思想及操作分析

思想:
  借助二分查找的思想,先查找插入位置,再移动数据,最后插入到正确的位置。
  我们都知道直接插入排序是一个边比较边移动的过程,而折半插入排序是先确定插入的位置,再来进行移动。
  插入排序的效率是由比较的次数和移动的次数共同决定的,而折半插入排序就是通过降低比较的次数来提高排序的效率。一起看看是如何进行操作的。

操作图解分析:
  有一组数据如下,现在我们需要将这组数据按从小到大进行排序。
插入排序--折半插入排序(来一来,看一看,走过路过,不要错过)
  将这一组数据分为有序组(有颜色的)和无序组(没有颜色的),数据的第一个元素默认为有序,如下:
插入排序--折半插入排序(来一来,看一看,走过路过,不要错过)
  将无序组中1号位置的数据进行拷贝,同时将1号位置收编到有序组序列中。此处将被拷贝位置的数据进行抹去方便进行分析,如下:
插入排序--折半插入排序(来一来,看一看,走过路过,不要错过)
  接着采用折半查找在有序组中查找插入位置,低地址端为有序组的第一个位置(记为:low),高地址端为有序组的最后一个有效元素的位置(记为:high),中端地址为mid=(low+high)/2,如下:
插入排序--折半插入排序(来一来,看一看,走过路过,不要错过)
  将94和mid所指位置上的元素进行比较,发现94>81,则low=mid+1,如下:
插入排序--折半插入排序(来一来,看一看,走过路过,不要错过)

  当high小于low时,则low所指的位置即为插入位置,low所指的位置即1号位置此时并没有有效数据则不需要进行移动,直接进行插入,如下:
插入排序--折半插入排序(来一来,看一看,走过路过,不要错过)

  继续从无序中将2号位置的数据进行拷贝,同时将二号位置收编到有序组的序列,依旧抹去2号位置的数据如下:
插入排序--折半插入排序(来一来,看一看,走过路过,不要错过)
  high指向有序组最后一个有效数据的位置,low指向有序组的第一个位置,mid为两者和的二分之一,如下:
插入排序--折半插入排序(来一来,看一看,走过路过,不要错过)
  将11和mid所指位置的元素进行比较,11<81,说明11要放在81的前面。high=mid-1,此时high变为-1,不大于low则low所指的位置即为要插入的位置。而此时low所指的位置存在有效元素,那么我们需要将有序组中low所指位置的数据及其后面位置的数据整体移动一个位置,如下:
插入排序--折半插入排序(来一来,看一看,走过路过,不要错过)
  将11插入到low所指的位置中,如下:
插入排序--折半插入排序(来一来,看一看,走过路过,不要错过)
  重复上面的操作,直至整个数据变为有序。给出最终的结果,如下:
插入排序--折半插入排序(来一来,看一看,走过路过,不要错过)

  每一次将无序组中的元素插入到有序组,都是通过二分查找法确定该元素会插入到有序组的哪一个位置后,再看该位置有没有被有效元素占据,没有就直接插入,有则将该位置元素及其后面位置的元素整体移动一个位置,再进行插入。


三.代码设计

基本步骤:
1.将数据进行分组,有序组和无序组;
2.从无序组中拷贝第一个位置的数据,采用二分查找法查找出该元素将要插入到有序组的哪一个位置;
3.将查找到的位置中的数据及其后面的数据整体移动一个位置;
4.将数据插入到查找到的位置;
5.重复2、3、4直到整个数据变为有序。

  大的方向可以将该算法分为三部分,第一部分:从无序组中取元素的操作;第二部分:采用二分查找法查找插入位置的操作;第三部分:移动元素空出插入位置,再将数据插入的操作。


四.代码实现

typedef int ElementType;
void BinaryInsertSort(ElementType array[], int size)
{
	int high;//高地址位置
	int low;//低地址位置
	int mid;//中端位置
	int i;//指示无序组中的元素位置
	int j;//指示有序组中的元素位置
	ElementType temp;//临时变量,用于拷贝数据
	for (i = 1; i < size; i++)//第一个位置默认有序
	{
		temp = array[i];//拷贝数据
		high = i - 1;//指向有序组中最后一个有效数据
		low = 0;//指向有序组中第一个数据位置
		while (low<=high)//采用二分查找,在有序组中找待插入元素的位置
		{
			mid = (low + high) / 2;//中间位置为low于high和的一半
			if (array[mid] < temp)//说明插入位置在mid的右边
			{
				low = mid + 1;//指向比较位置的后一个位置
			}
			else//说明插入位置在mid的左边
			{
				high = mid - 1;//指向比较位置的前一个位置
			}
		}
		for (j = i; j >=low; j--)//将查找的位置元素及其后面的元素整体移动一个位置
		{
			array[j] = array[j - 1];
		}
		array[low] = temp;//插入到正确位置
	}
}

五.总结

  折半插入排序通过减少元素比较次数使得排序效率得到提高。由于二分查找比顺序查找快,所以折半插入排序的平均性能来说比直接插入排序要好。
  时间复杂度为O(n^2),空间复杂度为O(1),是一种稳定的插入排序

如何提高插入排序的效率:
减少元素的比较次数
减少元素的移动次数

  下期我们讲解通过减少元素的比较次数和移动次数来提高插入排序效率的——希尔排序


  我是老胡,感谢阅读!!❤️ ❤️文章来源地址https://www.toymoban.com/news/detail-484009.html

到了这里,关于插入排序--折半插入排序(来一来,看一看,走过路过,不要错过)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 插入排序超详解释,一看就懂

    目录 一、插入排序的相关概念 1、基本思想 2、基本操作:有序插入 二、插入排序的种类 三、直接插入排序 1、直接插入排序的过程:顺序查找法查找插入位置 2、使用“哨兵”直接插入排序 四、 直接插入排序算法描述 五、折半插入排序 1、查找插入位置时采用折半查找法,

    2024年01月25日
    浏览(38)
  • 【数据结构】插入排序详细图解(一看就懂)

      💯 博客内容:【数据结构】插入排序详细图解(一看就懂) 😀 作  者:陈大大陈 🦉所属专栏:数据结构笔记 🚀 个人简介:一个正在努力学技术的准前端,专注基础和实战分享 ,欢迎私信! 💖 欢迎大家:这里是CSDN,我总结知识和写笔记的地方,喜欢的话请三连,

    2024年02月07日
    浏览(47)
  • 看一看什么是AI PC:人工智能电脑

    大家好啊,我是董董灿。 今天在一个群聊里,聊到了关于 AI PC (人工智能电脑)的话题。 之前看到过关于 AI PC 的新闻,说的是联想集团董事长兼CEO杨元庆在一次演讲中提到了 AI PC 的概念,并且绘声绘色的描绘了AI PC 的发展前景。 下了班,本着不懂就问的原则,路上搜了一些

    2024年02月22日
    浏览(54)
  • 看一看阿里云,如何把抽象云概念,用可视化表达出来。

    云数据库RDS_关系型数据库 云数据库RDS_关系型数据库 专有宿主机 云数据库RDS_关系型数据库_MySQL源码优化版 内容协作平台CCP-企业网盘协同办公-文件实时共享

    2024年03月12日
    浏览(74)
  • C语言入门到精通之练习七:输出特殊图案,请在c环境中运行,看一看,Very Beautiful!

    题目: 输出特殊图案,请在c环境中运行,看一看,Very Beautiful! 程序分析: 字符共有256个。不同字符,图形不一样。 VC6.0下出现中文乱码(原因+解决方法): 176的16进制是B0,219的16进制是DB,0xB0DB是\\\"佰\\\"字的内码,所以输出的就是\\\"佰\\\"了。 主要原因是文件信息的代码页不同,我们

    2024年01月23日
    浏览(35)
  • 47页深度研报:揭秘ChatGPT身后的AIGC技术和它的中国同行们,强烈推荐看一看!

      这篇研报,我看了感觉分析的还不错,风口来了,哪怕我们抓不住,也要置身其中~ AIGC技术,也称为自适应增强型遗传算法,是一种基于人工智能的优化算法,用于解决各种现实问题,如图像处理、数据挖掘、金融风险管理等领域。在这篇研究报告中,我们将深入探讨AIG

    2024年02月09日
    浏览(39)
  • 用Java(C语言也可以看)实现冒泡排序和折半查找(详细过程图)+逆序数组

      目录 一、冒泡排序 1.冒泡排序介绍 2.排序的思路 3.完整代码 二、折半查找 1.折半查找介绍 2.查找的思路 3.完整代码 三、逆序数组 1.逆序思路 2..完整代码 冒泡排序是众多排序的一种,无论在C语言或者Java中都很常见,后续在数据结构中也会用到 1.冒泡排序介绍 (1)冒泡排

    2024年02月05日
    浏览(43)
  • 请不要再用整数ID值插入数据库

    数据库设计在现代应用程序中不仅要满足数据完整性和性能需求,还需要考虑安全性。本文将讨论如何同时提高数据库的安全性和数据检索性能,以满足现代应用的需求。 在传统数据库设计中,使用整数 ID 作为主键可能存在安全风险,因为它们很容易被猜测。这可能导致未

    2024年02月08日
    浏览(32)
  • 算法 数据结构 递归插入排序 java插入排序 递归求解插入排序算法 如何用递归写插入排序 插入排序动图 插入排序优化 数据结构(十)

    1. 插入排序(insertion-sort):                                           是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入     算法稳定性:                  

    2024年02月09日
    浏览(53)
  • 排序算法:插入排序(直接插入排序、希尔排序)

    朋友们、伙计们,我们又见面了,本期来给大家解读一下有关排序算法的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏: C语言:从入门到精通 数据结构专栏: 数据结构 个  人  主  页 : stackY、 目录   前言: 1.排序

    2024年02月09日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包