C++数据结构X篇_21_插入排序(稳定的排序)

文章目录

  • [1. 插入排序原理](#1. 插入排序原理)
  • [2. 算法图解](#2. 算法图解)
  • [3. 核心代码:](#3. 核心代码:)
  • [4. 插入排序整体代码实现](#4. 插入排序整体代码实现)

1. 插入排序原理

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

  1. 原理是将无序序列插入到有序序列中
  2. 直接插入排序的两种性质:
  • 当待排序的原序列中大多数元素都已有序的情况下,此时进行的元素比较和移动的次数较少;

  • 当原序列的长度很小时,即便它的所有元素都是无序的,此时进行的元素比较和移动的次数还是很少。

后篇介绍的希尔排序就是基于上面2个性质的改进

2. 算法图解

将待排序的集合看做两部分,已排序的区间(0...i) ; 待排序的区间[i...n);每次选择无序区间的第一个元素插入到有序区间的合适位置,直到整个数组有序。

因为不知道数组中得前几个元素是已经有序的,所以直接从第二个元素开始执行插入排序,将每个元素都进行一次插入排序。

算法图解如下:

3. 核心代码:

cpp 复制代码
void insert_sort(int arr[], int length)  //升序
{
	int j;
	//第一个元素当做有序的,第二个看做无序,从第二个插入第一个元素并进行比较
	for (int i = 1; i < length; i++)
	{
		if (arr[i] < arr[i - 1])  //比升序序列最大值要小,进入插入排序
		{
			int temp = arr[i];
			//从右向左
			for (j = i - 1; j >= 0; j--)
			{
				if (temp < arr[j]) //升序序列中元素大于arr[i]
				{
					arr[j + 1] = arr[j]; //向前移动一位
				}
				else
				{
					break;
				}
			}
			arr[j + 1] = temp;
		}
	}
}

4. 插入排序整体代码实现

cpp 复制代码
#include <iostream>
using namespace std;

void swap(int* a, int* b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}

//打印数组
void printArr(int arr[])
{
	for (int i = 0; i < 10; i++)
	{
		cout << arr[i] << endl;
	}
}

//插入排序
void insert_sort(int arr[], int length)  //升序
{
	int j;
	for (int i = 1; i < length; i++)
	{
		if (arr[i] < arr[i - 1])  //比升序序列最大值要小
		{
			int temp = arr[i];
			for (j = i - 1; j >= 0; j--)
			{
				if (temp < arr[j]) //升序序列中元素大于arr[i]
				{
					arr[j + 1] = arr[j]; //向前移动一位
				}
				else
				{
					break;
				}
			}
			arr[j + 1] = temp;
		}
	}

	printArr(arr);
}

int main()
{
	int arr[] = { 8,2,3,9,6,4,7,1,5,10 };
	insert_sort(arr, 10);
	system("pause");
	return 0;
}

运行结果:

  1. 插入排序插入排序代码实现插入排序代码思路梳理
相关推荐
古月-一个C++方向的小白5 小时前
C++11之lambda表达式与包装器
开发语言·c++
tanyongxi667 小时前
C++ AVL树实现详解:平衡二叉搜索树的原理与代码实现
开发语言·c++
好易学·数据结构9 小时前
可视化图解算法56:岛屿数量
数据结构·算法·leetcode·力扣·回溯·牛客网
斯是 陋室9 小时前
在CentOS7.9服务器上安装.NET 8.0 SDK
运维·服务器·开发语言·c++·c#·云计算·.net
tju新生代魔迷10 小时前
C++:list
开发语言·c++
HHRL-yx10 小时前
C++网络编程 5.TCP套接字(socket)通信进阶-基于多线程的TCP多客户端通信
网络·c++·tcp/ip
tomato0910 小时前
河南萌新联赛2025第(一)场:河南工业大学(补题)
c++·算法
每一天都要努力^13 小时前
C++拷贝构造
开发语言·c++
NoirSeeker14 小时前
在windows平台上基于OpenHarmony sdk编译三方库并暴露给ArkTS使用(详细)
c++·windows·arkts·鸿蒙·交叉编译
落羽的落羽14 小时前
【C++】(万字)一文看懂“类与对象”
c++