C++数据结构X篇_21_插入排序(稳定的排序)
文章目录
- 1. 插入排序原理
- 2. 算法图解
- 3. 核心代码:
- 4. 插入排序整体代码实现
1. 插入排序原理
插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入
。
- 原理是将无序序列插入到有序序列中
- 直接插入排序的两种性质:
-
当待排序的原序列中大多数元素都已有序的情况下,此时进行的元素比较和移动的次数较少;
-
当原序列的长度很小时,即便它的所有元素都是无序的,此时进行的元素比较和移动的次数还是很少。
后篇介绍的希尔排序就是基于上面2个性质的改进
2. 算法图解
将待排序的集合看做两部分,已排序的区间(0…i) ; 待排序的区间[i…n);每次选择无序区间的第一个元素插入到有序区间的合适位置,直到整个数组有序。
因为不知道数组中得前几个元素是已经有序的,所以直接从第二个元素开始执行插入排序,将每个元素都进行一次插入排序。
算法图解如下:
3. 核心代码:
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. 插入排序整体代码实现
#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;
}
运行结果:
- 插入排序,插入排序代码实现,插入排序代码思路梳理
- 优秀博文:十大经典排序算法-插入排序算法详解,常见的几种排序(C++)