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. 插入排序插入排序代码实现插入排序代码思路梳理
相关推荐
kiracrimson19 小时前
从缓存的角度看链表与线性表的差异
数据结构·链表·缓存
心抵鹊20 小时前
归并排序之翻转对(hard)
数据结构·算法
_Twink1e21 小时前
openJiuwen 实训营 Day 1 · WorkSwarm 入门教程
开发语言·c++·openjiuwen
dong_junshuai21 小时前
每天一个开源项目#87 fmt:24.5K Stars 的 C++ 格式化核心
c++·开源·github
雪的季节1 天前
Multisim14.0的详细中文安装步骤【附安装包】
c++
Persistent的粽子!1 天前
C++:类与对象(二)
开发语言·c++
白狐_7981 天前
408 数据结构|红黑树插入:只记两大类
数据结构
蒸蒸yyyyzwd1 天前
cpp 选手备战秋招学习笔记 day23
c++·求职招聘
.YM.Z1 天前
C++ STL 容器深度剖析:vector 与 list 的模拟实现及对比
开发语言·c++·vector·list
mengzhi啊1 天前
QEventLoop loop配合loop.exec();替代while(1)。电脑cpu占用为0,使用while(1)cpu占用率100%
c++·qt