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. 插入排序插入排序代码实现插入排序代码思路梳理
相关推荐
阿猿收手吧!4 分钟前
【C++】C++模板特化:精准定制泛型逻辑
开发语言·c++·算法
C语言小火车31 分钟前
Qt样式实现方式详解:六大方法全面解析
c语言·c++·qt·学习
weixin_4521595531 分钟前
C++与Java性能对比
开发语言·c++·算法
会叫的恐龙35 分钟前
C++ 核心知识点汇总(第一日)(输入输出与变量、类型转换)
开发语言·c++
2301_7657031439 分钟前
C++中的工厂模式实战
开发语言·c++·算法
退休钓鱼选手1 小时前
[CommonAPI + vsomeip]通信 客户端 5
c++·人工智能·自动驾驶
what丶k1 小时前
深度解析:以Kafka为例,消息队列消费幂等性的实现方案与生产实践
java·数据结构·kafka
星火开发设计1 小时前
C++ 输入输出流:cin 与 cout 的基础用法
java·开发语言·c++·学习·算法·编程·知识
玖釉-1 小时前
探索连续细节层次(Continuous LOD):深入解析 NVIDIA 的 nv_cluster_lod_builder
c++·windows·图形渲染
sayang_shao2 小时前
C++ ONNX Runtime 与 Python Ultralytics 库实现 YOLOv8 模型检测的区别
c++·python·yolo