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. 插入排序插入排序代码实现插入排序代码思路梳理
相关推荐
原来是猿3 分钟前
蓝桥备赛(四)- 数组(下)
开发语言·数据结构·c++·算法
zjkzjk77115 分钟前
reallocate() 和 allocate() 的区别
c++
ephemerals__14 分钟前
【数据结构进阶】哈希表
数据结构·算法·散列表
星霜旅人34 分钟前
【C++】深入理解List:双向链表的应用
c++
刀客12338 分钟前
C++ STL(三)list
开发语言·c++
-拟墨画扇-1 小时前
C++ | 面向对象 | 类
c++·深拷贝··静态成员·友元函数·类拷贝构造函数·类构造析构函数
阿巴~阿巴~1 小时前
关于回溯算法中的剪枝是否需要for循环的总结归纳
数据结构·c++·算法·深度优先·剪枝
Dovis(誓平步青云)1 小时前
【数据结构】二叉树(门槛极低的系统理解)
c语言·数据结构·算法
朔北之忘 Clancy1 小时前
2022 年 12 月青少年软编等考 C 语言五级真题解析
c语言·开发语言·c++·学习·算法·青少年编程·题解
CoderCodingNo2 小时前
【GESP】C++二级模拟 luogu-b3995, [GESP 二级模拟] 小洛的田字矩阵
开发语言·c++·矩阵