数据结构从入门到精通——直接插入排序

这篇具有很好参考价值的文章主要介绍了数据结构从入门到精通——直接插入排序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

直接插入排序是一种简单的排序算法,其工作原理是逐个将待排序元素插入到已排序序列中的适当位置,直到全部元素排序完毕。算法从第二个元素开始,将其与前面的元素进行比较,如果当前元素小于前一个元素,则将其插入到前一个元素之前,否则继续向前比较。重复此过程,直到当前元素找到合适的插入位置。每次插入一个元素后,已排序序列的长度增加1,直到整个序列排序完成。直接插入排序的时间复杂度为O(n^2),在数据量较小时效率较高,但在大规模数据排序中性能不佳。


一、直接插入排序的基本思想:

直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。

具体步骤为:从第一个元素开始,认为该元素已经被排序;取出下一个元素,在已排序的元素序列中从后向前扫描;如果该元素(已排序)大于新元素,将该元素移到下一位置;重复步骤,直到找到已排序的元素小于或者等于新元素的位置;将新元素插入到该位置后;重复以上步骤。

二、直接插入排序的实例

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

假设我们有一个整数列表 [5, 3, 8, 4, 2] 需要进行排序。

首先,我们认为列表的第一个元素 5 已经是一个有序序列。

然后,我们取第二个元素 3,与已排序序列 [5] 进行比较。因为 3 小于 5,所以我们将 3 插入到 5 的前面,得到新的已排序序列 [3, 5]

接下来,我们取第三个元素 8,与已排序序列 [3, 5] 进行比较。8 大于 35,所以我们将 8 插入到序列的末尾,得到新的已排序序列 [3, 5, 8]

然后,我们取第四个元素 4,与已排序序列 [3, 5, 8] 进行比较。4 应该插入到 35 之间,所以我们将 4 插入到适当的位置,得到新的已排序序列 [3, 4, 5, 8]

最后,我们取第五个元素 2,与已排序序列 [3, 4, 5, 8] 进行比较。2 是最小的元素,所以我们将 2 插入到序列的最前面,得到最终的已排序序列 [2, 3, 4, 5, 8]

通过这个过程,我们可以看到直接插入排序是如何逐步构建有序序列的。虽然直接插入排序在大数据集上可能不是最有效的排序算法,但它的实现简单,对于小规模数据或部分有序的数据,直接插入排序是一个很好的选择。

实际中我们玩扑克牌时,就用了插入排序的思想
数据结构从入门到精通——直接插入排序,数据结构从入门到精通,数据结构,排序算法,算法,c语言,leetcode,广度优先,推荐算法
当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移

数据结构从入门到精通——直接插入排序,数据结构从入门到精通,数据结构,排序算法,算法,c语言,leetcode,广度优先,推荐算法
直接插入排序的特性总结:

  1. 元素集合越接近有序,直接插入排序算法的时间效率越高
  2. 时间复杂度:O(N^2)
  3. 空间复杂度:O(1),它是一种稳定的排序算法
  4. 稳定性:稳定

直接插入排序的特性总结,在于其简单直观、稳定且空间复杂度低,但同时其时间复杂度较高,特别是在处理大数据集时效率不高。

直接插入排序是一种简单的排序算法,它的基本思想是将一个待排序的元素按其大小插入到已排序的序列中的适当位置,从而得到一个新的、个数增加1的有序序列。这一过程从第一个元素开始,每次将一个元素插入到已排序序列的合适位置,直到所有元素都插入完毕。

直接插入排序的稳定性是其一大特点。稳定性指的是在排序过程中,相等的元素在排序前后的相对位置不变。由于直接插入排序在插入元素时,遇到相等元素会选择将新元素放在已有元素的后面,因此它能够保证稳定性。

此外,直接插入排序的空间复杂度较低,因为它只需要一个额外的存储空间来暂存待插入的元素,不需要像其他排序算法那样开辟额外的数组空间。

然而,直接插入排序的时间复杂度较高,尤其是当处理大数据集时。在最坏的情况下,即待排序序列完全逆序时,直接插入排序的时间复杂度为O(n^2),其中n为待排序元素的个数。这意味着随着数据量的增加,排序所需的时间将呈平方级增长,导致效率低下。

综上所述,直接插入排序具有稳定性好、空间复杂度低的特点,但时间复杂度较高,适用于小规模数据的排序。在实际应用中,可以根据数据的特点和排序需求来选择合适的排序算法。

三、直接插入排序的动图展示

直接插入排序

直接插入排序是一种简单的排序算法。其工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。动图展示这一过程:初始时,已排序序列只包含一个元素,每次从未排序序列中取出一个元素,与已排序序列中的元素比较并插入到正确位置,直到所有元素都插入到已排序序列中,排序完成。此过程通过动画形式展示,能直观理解直接插入排序的工作原理。

四、直接插入排序的具体代码

test.c

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void InsertSort(int* a,int n)
{
	for (int i = 0; i < n - 1; i++)//因为本函数记录的是下一个位置,所以是n - 1 
	{
		int end = i;
		int tmp = a[end + 1];//记录下一个位置
		while (end >= 0)//从当前位置逐个向前判断
		{
			if (tmp < a[end])
			{
				a[end + 1] = a[end];//直接拷贝
				end--;
			}
			else
			{
				break;
			}
		}
		a[end + 1] = tmp;//覆盖
	}
}


void PrintArray(int* a, int n)
{
	for (int i = 0; i < n; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
}
void TestOP()
{
	srand((unsigned int)time(0));
	const int N = 10000;
	int* a = (int*)malloc(sizeof(int) * N);
	for (int i = 0; i < N; i++)
	{
		a[i] = rand();
	}
	int begin1 = clock();
	InsertSort(a, N);
	int end1 = clock();

	printf("InsertSort:%d\n", end1 - begin1);
	free(a);
}
void TestInsertSort()
{
	int a[] = { 5, 3, 9, 6, 2, 4, 7, 1, 8 };
	PrintArray(a, sizeof(a) / sizeof(int));

	InsertSort(a, sizeof(a) / sizeof(int));

	PrintArray(a, sizeof(a) / sizeof(int));
}
int main()
{
	TestInsertSort();
	
	TestOP();

	return 0;
}

该段代码实现了插入排序算法。函数InsertSort接受一个整数数组a和数组长度n作为参数。算法通过逐个处理数组中的元素,将其插入到已排序部分的正确位置,从而实现整个数组的排序。在每次迭代中,算法选择当前位置之后的一个元素,并向前搜索已排序部分,直到找到适当的位置插入该元素。算法通过覆盖元素的位置来实现插入,并在循环结束时将当前元素放置到正确的位置。这个过程对数组中的每个元素都重复进行,直到整个数组都被排序。

数据结构从入门到精通——直接插入排序,数据结构从入门到精通,数据结构,排序算法,算法,c语言,leetcode,广度优先,推荐算法文章来源地址https://www.toymoban.com/news/detail-842063.html


到了这里,关于数据结构从入门到精通——直接插入排序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 数据结构进阶篇 之 【插入排序】详细讲解(直接插入排序,希尔排序)

    千万不要因为一件事不会做而失去信心,你又不是只有这一件事不会,你还有很多呢 1.1 基本思想 1.2 实现原理 1.3 代码实现 1.4 直接插入排序的特性总结 2.1 基本思想 2.2 实现原理 2.3 代码实现 2.4希尔排序的特性总结 –❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–

    2024年04月12日
    浏览(71)
  • 直接插入排序、希尔排序、直接选择排序、堆排序、冒泡排序——“数据结构与算法”

    各位CSDN的uu们你们好呀,今天小雅兰的内容是数据结构与算法啦,是排序!!!下面,让我们进入七大排序的世界吧!!! 排序:所谓排序,就是使一串记录,按照其中的某个或某些的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在

    2024年02月15日
    浏览(65)
  • 【数据结构与算法】直接插入排序和希尔排序

    进入了初阶数据结构的一个新的主题——排序。所谓排序,就是一串记录, 按照其中的某几个或某些的大小(一定的规则) , 递增或递减排列起来的操作 。 排序的 稳定性 :在一定的规则下,两个值相等的元素,在排序算法处理前后的相对位置是否发生变化,如果相

    2024年04月13日
    浏览(41)
  • 【数据结构常见七大排序(一)】—插入排序篇【直接插入排序】And【希尔排序】

    目录 1.排序的概念及其运用 1.1排序的概念 1.2排序运用 1.3常见的七大排序 2.直接插入排序 2.1基本思想 2.2直接插入排序 2.3动图助解 2.4直接插入排序源码 2.5直接插入排序的特性总结 3.希尔排序( 缩小增量排序 ) 3.1希尔排序概念及思想 3.2希尔排序图解 3.3希尔排序源码 3.4希尔排序

    2024年02月13日
    浏览(50)
  • 数据结构--7.2.1排序算法(冒泡、直接选择、直接插入)

            假设含有n个记录的序列为{r1,r2,……,rn},其相应的分别为{K1,K2,……,Kn},需确定1,2,3,……,n的一种排序p1,p2,p3,……,pn;使其相应的满足kp1=kp2=kp3=kp4=……=kpn非递减(或非递增)关系,即使得序列称为一个按有序得序列{rp1,rp2,

    2024年02月07日
    浏览(69)
  • 【数据结构】冒泡,快速,直接插入,归并,选择排序

    🎊专栏【数据结构】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【Dream It Possible】 大一同学小吉,欢迎并且感谢大家指出我的问题🥰 目录   🎁冒泡排序 🏳️‍🌈图解 🏳️‍🌈实现过程 🏳️‍🌈代码 🎁快速排序 🏳️‍🌈图解 🏳️‍🌈实现过

    2024年02月06日
    浏览(73)
  • 【数据结构】详解七大排序算法(直接插入排序、希尔排序、直接选择排序、堆排序、冒泡排序、快速排序)

    1、基本思想    把待排序的数按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所以的记录插入完为止,得到一个新的有序序列。    实际中我们玩扑克牌时,就用到了插入排序的思想 基本步骤:    当插入第i个元素时,前面的arr[0]、arr[2]…arr

    2024年02月04日
    浏览(72)
  • 【数据结构】 七大排序详解(壹)——直接插入排序、希尔排序、选择排序、堆排序

    排序 :所谓排序,就是使一串记录,按照其中的某个或某些的大小,递增或递减的排列起来的操作。 稳定性 :假定在待排序的记录序列中,存在多个具有相同的的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而

    2024年02月09日
    浏览(65)
  • 【数据结构】手撕排序NO.2----直接插入排序与希尔排序

      目录 一. 导入 二. 直接插入排序         2.1 基本思想         2.2 过程分析         2.3 代码实现         2.4 复杂度/稳定性分析 三. 希尔排序(缩小增量排序)         3.1 基本思想         3.2 过程分析          3.3 代码实现          3.4 复杂度/稳定性分析  

    2024年02月14日
    浏览(41)
  • 数据结构与算法基础(王卓)(28):排序概述(分类)、直接插入排序思路

    目录 排序分类:(本章目录) 按数据存储介质:(学习内容) 内部排序: 外部排序: 按比较器个数:(学习内容) 串行排序: 并行排序: 按主要操作:(学习内容、里面的排序都会重点学) 比较排序: 基数排序: 按辅助空间: 原地排序: 非原地排序: 按稳定性: 稳

    2023年04月26日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包