插入排序(Insertion Sort)

C++自学精简教程 目录(必读)

插入排序

每次选择未排序子数组中的第一个元素,从后往前,插入放到已排序子数组中,保持子数组有序。

打扑克牌,起牌。

输入数据

42 20 17 13 28 14 23 15

执行过程

完整代码

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

void print_array(const char* msg, int* arr, int n)
{
	cout << msg << " ";
	for (int i = 0; i < n; i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
}
//swap two number
void Swap(int& a, int& b)
{
	int tmp = a; a = b; b = tmp;
}

//将newValue插入到子数组arr中,arr的长度为length
void Insert(int* arr, int newValueindex, int newValue)
{
	// newValueindex=1     {arr[0]}    <== arr[1]           
	// newValueindex=2     {arr[0], arr[1]}    <== arr[2]
	// ......
	// newValueindex=n-1   {arr[0], arr[1],... arr[n-2]}    <== arr[n-1]

	// [a,   b,   c,   d]    e
	//  0              j     length   

	int j = newValueindex - 1;
	for (; j >= 0; j--)
	{
		if (arr[j] > newValue)
		{
			//move arr[j] to the next position,for newVaule
			arr[j + 1] = arr[j];
		}
		else
		{
			break;//break 发生时, j 的值可能是 0
		}
	}
	//发生了移动,j会停止在最后一个需要被移动的位置的前面一个位置
	if (j != newValueindex - 1)
	{
		arr[j+1] = newValue;
	}
}

void InsertSort(int* arr, int n)
{
	if (n <= 1)
	{
		return;
	}
	//将下标为1的元素插入到{arr[0]}中
	//将下标为2的元素插入到{arr[0], arr[1]}中
	//......
	//将下标为n-1的元素插入到{arr[0], arr[1], arr[n-2]}中
	for (int i = 1; i < n; i++) 
	{
		//将未排序序列中的第一个元素插入到已排序的序列中
		Insert(arr, i, arr[i]);//insert first element in unsorted list to the sorted list
		print_array("one trip", arr, n);
	}
}

void test(vector<int> arr)
{
    //输出原始序列
	print_array("original array:", arr.data(), arr.size());
	//执行排序,并输出排序过程
	InsertSort(arr.data(), arr.size());
	//输出排序后的列表
	print_array("after sorted:",arr.data(), arr.size());
	cout << endl;
}

int main()
{
	test({ 1 });
	test({ 1 , 2 });
	test({ 2 , 1 });
	test( { 2 , 2 });
	test({ 42, 20, 17, 13, 28, 14, 23, 15 });
	test({ 1, 8, 3, 6, 5, 4, 7, 2 , 9 });
	test( { 8, 8, 6, 6, 7, 5, 5, 7, 9 , 9});
	return 0;
}

执行结果

cpp 复制代码
original array: 1
after sorted: 1

original array: 1 2
one trip 1 2
after sorted: 1 2

original array: 2 1
one trip 1 2
after sorted: 1 2

original array: 2 2
one trip 2 2
after sorted: 2 2

original array: 42 20 17 13 28 14 23 15
one trip 20 42 17 13 28 14 23 15
one trip 17 20 42 13 28 14 23 15
one trip 13 17 20 42 28 14 23 15
one trip 13 17 20 28 42 14 23 15
one trip 13 14 17 20 28 42 23 15
one trip 13 14 17 20 23 28 42 15
one trip 13 14 15 17 20 23 28 42
after sorted: 13 14 15 17 20 23 28 42

original array: 1 8 3 6 5 4 7 2 9
one trip 1 8 3 6 5 4 7 2 9
one trip 1 3 8 6 5 4 7 2 9
one trip 1 3 6 8 5 4 7 2 9
one trip 1 3 5 6 8 4 7 2 9
one trip 1 3 4 5 6 8 7 2 9
one trip 1 3 4 5 6 7 8 2 9
one trip 1 2 3 4 5 6 7 8 9
one trip 1 2 3 4 5 6 7 8 9
after sorted: 1 2 3 4 5 6 7 8 9

original array: 8 8 6 6 7 5 5 7 9 9
one trip 8 8 6 6 7 5 5 7 9 9
one trip 6 8 8 6 7 5 5 7 9 9
one trip 6 6 8 8 7 5 5 7 9 9
one trip 6 6 7 8 8 5 5 7 9 9
one trip 5 6 6 7 8 8 5 7 9 9
one trip 5 5 6 6 7 8 8 7 9 9
one trip 5 5 6 6 7 7 8 8 9 9
one trip 5 5 6 6 7 7 8 8 9 9
one trip 5 5 6 6 7 7 8 8 9 9
after sorted: 5 5 6 6 7 7 8 8 9 9
相关推荐
_wyt0014 小时前
洛谷 B3930 [GESP202312 五级] 烹饪问题 题解
c++·gesp
LDR0066 小时前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术6 小时前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript
通信小呆呆6 小时前
当算法有了“五感”:多模态数据融合如何向人体感官协同学习?
人工智能·学习·算法·机器学习·机器人
码云数智-园园7 小时前
C++20 Modules 模块详解
java·开发语言·spring
benben0447 小时前
强化学习之DQN算法族(基于gymnasium开发)
算法
swordbob7 小时前
NIO的channel中什么是 fd(File Descriptor,文件描述符)
java·开发语言·nio
小小工匠8 小时前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
源分享8 小时前
Java线程同步的多种实现方法(非常详细)
java·开发语言·jvm