【排序算法】一、排序概念和直接插入排序(C/C++)

这篇具有很好参考价值的文章主要介绍了【排序算法】一、排序概念和直接插入排序(C/C++)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

「前言」文章内容是排序算法之直接插入排序的讲解。(所有文章已经分类好,放心食用)

「归属专栏」排序算法

「主页链接」个人主页

「笔者」枫叶先生(fy)

一、排序概念的介绍

排序的概念

  • 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作
  • 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的
  • 内部排序:数据元素全部放在内存中的排序
  • 外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内存和外存之间移动数据的排序

常见的排序算法

【排序算法】一、排序概念和直接插入排序(C/C++),# 排序算法,排序算法,c语言,c++

二、直接插入排序

2.1 原理

直接插入排序是一种简单直观的排序算法,它的基本思想是将一个元素插入到已经排好序的部分数组中,从而使得数组保持有序。[基于数组(顺序表)的结构进行排序)]

例如,假设前n-1个元素已有序,现将第n个元素插入到前面已经排好的序列中,使得前n个元素有序。按照此法对所有元素进行插入,直到整个序列有序

具体步骤如下:

  1. 从第一个元素开始,该元素可以认为已经被排序;
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描;
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置;
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
  5. 将新元素插入到该位置后;
  6. 重复步骤2~5

例如,对数组[4, 2, 5, 1, 6, 3]进行排序,使用直接插入排序,如下:(升序)
【排序算法】一、排序概念和直接插入排序(C/C++),# 排序算法,排序算法,c语言,c++
动图演示:(数据不和上面相同)
【排序算法】一、排序概念和直接插入排序(C/C++),# 排序算法,排序算法,c语言,c++

时间、空间复杂度

  • 时间复杂度最好情况下为O(N),此时待排序列为升序,或者说接近升序
  • 时间复杂度最坏情况下为O(N^2),此时待排序列为逆序,或者说接近逆序
  • 总的来说,直接插入排序的时间复杂度为O(N^2)
  • 在原有的数组上操作,空间复杂度为O(1)

2.2 代码实现(C/C++)

C语言代码如下:(升序)

// 直接插入排序
void InsertSort(int* arr, int n) // arr:需要排序的数组; n:数组的大小
{
	for (int i = 0; i < n-1; ++i) // 达到n-1时,数组已经有序,无需再遍历最后一次,避免多余的循环
	{
		// [0, end]有序,把end+1位置的值插入,保持有序
		int end = i; // 记录有序序列的最后一个下标
		int tmp = arr[end + 1]; // 保存等待插入的值

		while (end >= 0) 
		{
			if (arr[end] > tmp) // arr[end]比要插入的数大,向后移动
			{
				arr[end + 1] = arr[end]; // 向后移,进行覆盖,tmp已经保存被覆盖的值
				--end; // 迭代
			}
			else // arr[end]比要插入的数小,已有序,跳出循环
			{
				break;
			}
		}
		arr[end + 1] = tmp; // 进行插入
	}
}

C++代码:(升序)

// 直接插入排序
void InsertSort(vector<int>& arr)
{
	int n = arr.size();
	for (int i = 0; i < n - 1; ++i) // 达到n-1时,数组已经有序,无需再遍历最后一次,避免多余的循环
	{
		// [0, end]有序,把end+1位置的值插入,保持有序
		int end = i; // 记录有序序列的最后一个下标
		int tmp = arr[end + 1]; // 保存等待插入的值

		while (end >= 0)
		{
			if (arr[end] > tmp) // arr[end]比要插入的数大,向后移动
			{
				arr[end + 1] = arr[end]; // 向后移,进行覆盖,tmp已经保存被覆盖的值
				--end; // 迭代
			}
			else // arr[end]比要插入的数小,已有序,跳出循环
			{
				break;
			}
		}
		arr[end + 1] = tmp; // 进行插入
	}
}

2.3 特性总结

直接插入排序的特性总结

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

--------------------- END ----------------------文章来源地址https://www.toymoban.com/news/detail-813317.html

「 作者 」 枫叶先生
「 更新 」 2024.1.9
「 声明 」 余之才疏学浅,故所撰文疏漏难免,
          或有谬误或不准确之处,敬请读者批评指正。

到了这里,关于【排序算法】一、排序概念和直接插入排序(C/C++)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【排序算法】排序算法介绍及插入排序 ( 直接插入排序 && 希尔排序 )

    ​ ​📝个人主页:@Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:数据结构 🎯 长路漫漫浩浩,万事皆有期待 排序 :所谓排序,就是将一串数据,按照某种规律,或者以某种特性或,将数据按照递增或者递减,将数据从 无序转变为有序

    2023年04月21日
    浏览(42)
  • 排序算法之一:直接插入排序

    直接插入排序是一种简单的插入排序法,其基本思想是: 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列  实际中我们玩扑克牌时,就用了插入排序的思想 当插入第i(i=1)个元素时, 前面的

    2024年02月04日
    浏览(33)
  • 十大排序算法(上)直接插入排序、希尔排序、直接选择排序、堆排序

    排序,就是使一串记录,按照其中的某个或某些的大小,递增或递减的排列起来的操作。 稳定性 :假设在待排序的序列中,存在多个具有相同内容的元素,如果经过排序,这些元素的相对位置并不发生改变,则称这种排序算法是稳定的。 稳定的排序可以变成不稳定的

    2024年02月05日
    浏览(48)
  • 数据结与算法之排序-插入排序(直接插入/折半插入/希尔)

    文章目录 目录 前言 一、什么是插入排序 1.直接插入排序 2.折半插入排序          3.希尔排序 总结 理解三种排序,并将三种排序用C++实现,借鉴了王卓老师和没有难学的知识的图例 提示:以下是本篇文章正文内容,下面案例可供参考         插入排序是简单直观的排序方

    2024年02月04日
    浏览(42)
  • 排序算法 —— 直接插入排序(图文超详细)

    直接插入排序是一个比较简单的排序算法。作用是将一组数排序成升序的。 元素集合越接近有序,直接插入排序算法的时间效率越高。 时间复杂度:O(n^2) 空间复杂度:0(1),它是一种稳定的排序算法。 稳定性:稳定 下面以 5 4 3 6 2 这组数作为例子来讲解。 直接插入排序就像

    2024年02月08日
    浏览(34)
  • 【数据结构】常见排序算法——常见排序介绍、插入排序、直接插入排序、希尔排序

      在计算机科学中,排序是将一组数据按照指定的顺序排列的过程。排序算法由于执行效率的不同可以分为多种不同的算法。   通常情况下,排序算法可以分为两类,即 内部排序和外部排序 。内部排序是指数据全部加载到内存中进行排序,适用于数据量较小的情况,而

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

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

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

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

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

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

    2024年02月04日
    浏览(77)
  • 稳定的排序算法:直接插入排序和冒泡排序 (c++实现)

    1.直接插入排序: 插入排序:就是把数组分为左右两个序列,保持左边序列中所有元素是有序的,(当左边序列只有第一个元素时,本身就是有序的,)每次往后移一个,将这个元素保存起来,跟左边的元素进行比较,直到找到第一个小于它的元素后停下,此时的位置是这个

    2024年02月10日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包