插入排序(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
相关推荐
2401_833269304 分钟前
Java多线程:从入门到进阶
java·开发语言
z200509306 分钟前
C++中的右值引用
开发语言·c++
SilentSamsara7 分钟前
迭代器协议:`__iter__` / `__next__` 的完整执行流程
开发语言·人工智能·python·算法·机器学习
AI科技星7 分钟前
算法联盟ROOT · 全域数学物理卷第20、21、22分册:量子纠缠、隐形场论与时间膨胀
人工智能·算法·数学建模·数据挖掘·机器人
平凡但不平庸的码农11 分钟前
Go Channel详解
开发语言·后端·golang
laomocoder14 分钟前
Project-Nexus-WAN-跨公网Agent对话
开发语言·php
子安柠15 分钟前
深入理解 Go 语言文件操作:从基础到最佳实践
开发语言·后端·golang
代码中介商16 分钟前
C++文件流操作全解析
开发语言·c++
Forget_855017 分钟前
RHEL——Kubernetes容器编排平台(二)
java·开发语言
Achou.Wang19 分钟前
go语言中使用等待组(waitgroups)和内存屏障(barriers)进行同步
开发语言·后端·golang