当前位置: 首页 > article >正文

数据结构-插入排序

一.概要

插入排序是一种基于比较的排序算法,其基本思想是将待排序的元素插入到已排序的序列中,形成新的有序序列。

插入排序算法的过程如下:

  1. 将待排序序列分为两部分:已排序部分和未排序部分;

  2. 初始时,已排序部分只有一个元素,即第一个元素,未排序部分包含剩下的所有元素;

  3. 对于未排序部分中的每个元素,从后向前扫描已排序部分,找到其在已排序部分中的位置;

  4. 将该元素插入到已排序部分中的相应位置,使得插入后仍然保持有序。

        在实现过程中,我们可以使用循环来遍历未排序部分中的每个元素,并将其插入到已排序部分中。具体实现方法是,从当前位置向前遍历已排序部分,找到第一个比当前元素小的位置,然后将当前元素插入到这个位置之后。插入排序算法的时间复杂度为 O(n2)O(n2),其中 nn 是待排序序列的长度。

         相比冒泡排序和选择排序,插入排序虽然执行次数也是 O(n2)O(n2),但是其内部循环的比较操作更少,因此效率更高。尤其对于基本有序或者小规模的序列,插入排序的性能表现更为优秀。

void InsertSort(int* a, int n) {
	for (int i = 1; i < n; i++)
	{
		int end=i-1;
		int tmp=a[i];
		//将tmp插入[0,end]区间
		while (end>=0)
		{
			if (tmp < a[end])
			{
				a[end + 1] =a[end];
				--end;
			}
			else
			{
				break;
			}
		}
		a[end + 1] = tmp;
	}
}

该函数接受两个参数:一个整型数组 a 和数组的长度 n。该函数的实现过程如下:

  1. for 循环从第二个元素开始遍历整个数组,每次从数组中取出一个元素并保存在变量 tmp 中;

  2. 变量 end 记录已排序部分的最后一个元素的下标,初始值为当前元素的前一个下标;

  3. 使用 while 循环从已排序部分的最后一个元素向前遍历,将所有比当前元素大的元素向右移动一位(即将元素 a[end] 移动到 a[end + 1] 的位置),直到找到第一个比当前元素小的元素的下标,将变量 end 更新为该下标;

  4. 将变量 tmp 插入到合适的位置上(即将 tmp 赋值给位于下标 end+1 的元素)

测试文件

void test1() {
	int a[] = {1,8,9,10,11,12,18,16,19,20};
	int n = sizeof(a) / sizeof(a[0]);
	PrintSort(a, n);
	InsertSort(a,n);
	PrintSort(a,n);
}

int main() {
	test1();
	return 0;
}

小蒋同学的CSDN: 用于CSDN文章中的代码分享 - Gitee.comhttps://gitee.com/jiang-yanxi123/xiaojiangs---csdn/tree/master/test0408


http://www.kler.cn/a/9348.html

相关文章:

  • 【C++】new操作符的使用说明
  • 【再谈设计模式】抽象工厂模式~对象创建的统筹者
  • SOLIDWORKS代理商鑫辰信息科技
  • 记录学习react的一些内容
  • kettle开发-Day43-数据对比
  • 实战指南:理解 ThreadLocal 原理并用于Java 多线程上下文管理
  • 一、源码详解(第一阶段)
  • 面向对象编程(进阶)5:关键字:super
  • 数据传输控制方式
  • 【虹科案例】虹科脉冲发生器在读出电子测试中的应用
  • docker安装mysql+redis+nginx
  • 外卖小程序01
  • 什么是转化率优化(CRO)?网站转化率不高,可以看看这篇文章
  • 内存对齐总结
  • Java异常处理
  • 【AUTOSAR】【Lin通信】Lin
  • Java实验课的学习笔记(二)类的简单使用
  • 2023年,软件测试行业怎么样?
  • Spark 并行度
  • docker 安装redis
  • 文档流normal flow
  • Redis - 基础数据类型
  • 签约喜讯 | Smartbi携手金域医学共建统一数据运营平台
  • Dart语言操作符?和!的用法
  • 优思学院|《精益思想》读后感
  • Fork分支代码与主干保持同步