1097 字
5 分钟
插入排序

将目标数组分为有序和无序两部分,最开始有序部分没有元素,从无序数组取第一个元素向有序数组中插入并且不破坏有序数组的有序性(这个要向有序数组中插入的元素暂时命名为W),从有序数组的最后一个元素从后往前开始比较,如果W小于有序数组的最后一个元素,则交换W与有序数组最后一个元素,然后继续用W与前一个元素比较,直至W不小于他前面的元素,退出循环,就将这个W插入前面的有序数组且不破坏有序数组的有序性,得到的是一个新的有序数组。

参考图中的思路方便理解:#

蓝色部分代表无序数组,绿色部分代表有序数组,每次将无序数组的第1个元素向前面有序数组中插入,并且不破坏原有序数组的有序性。最开始有序数组为空,我们将无序数组的第1个元素6向有序数组中插入。得到下面的情况,有序数组中有一个元素6,后面是无序数组。

然后我们需要将新的无序数组中的第1个元素1向有序数组中插入。

因为在插入时不能破坏原有序数组的有序性,所以我们应该用1从有序数组的最后一个元素往前开始比较,直到找到一个比他还小的元素后才停止。这里1小于6,所以1移动到6的前面。然后再用要插入的这个1和1前面的元素比较,1前面没有元素了,1就无需移动了。

这里是将无序数组中的第1个元素,9向有序数组中插入。用9和它前面的元素6进行比较,9不比6小,所以直接就放到6的后面。

然后是2向有序数组中插入。用2和它前面的9比较,2小于9,所以2移动到9的前面,然后再用2和它前面的6比较,2小于6,所以2移动到6的前面,然后再用2和前面的1比较,2不小于1,2就无需移动了。

然后将3向有序数组中插入。用3和它前面的9比较,3小于9,所以移动到9的前面,再用3和它前面的6比较,3小于6,所以3移动到6的前面,然后再用3与它前面的的2比较,3不小于2,3就无需移动了。

然后将7向有序数组中插入,用7和他前面的9比较,7小于9,所以7移动到9的前面,然后再用7与它前面的6进行比较,7不小于6,7就无需移动了。

然后将19向有序数组中插入,用19和他前面的9比较,19不小于9,所以19无需移动。

然后将15向有序数组中插入,用15和它前面的19比较,15小于19,所以15移动到19的前面,然后再用15与它前面的9进行比较,15不小于9,15就无需移动了。

C++代码如下:#

#include<stdio.h>
#include<iostream>
#include<vector>
using namespace std;
void Insert_sort(vector<int>& vec) {
for (int i = 1; i < vec.size(); ++i) {//i为无需数组的第一位
//外层循环从1开始,前面第一个数字是有序数组,后面的部分是无序数组。
//从0开始也可以,那第一次循环就什么都没做直接++i
for (int j = i - 1; j >= 0; --j) {//j为有序数组的最后一位
//判断无序数组的第一个元素vec[j + 1]是否小于有序数组的最后一个元素vec[j],如果小,则交换位置,要插入的元素到vec[j]的位置,然后--j,继续判断要插入的元素是否小于前面的元素,直到不小于后break退出循环
if (vec[j] > vec[j + 1]) {
int temp = vec[j];
vec[j] = vec[j + 1];
vec[j + 1] = temp;
}
else break;
}
}
}
int main() {
vector<int> a = { 30, 20, 40, 10 };
Insert_sort(a);
for (int i = 0; i < 4; ++i) {
cout << a[i] << " ";
}
return 0;
}
插入排序
https://fuwari.cbba.top/posts/插入排序/
作者
Chen_Feng
发布于
2023-02-19
许可协议
CC BY-NC-SA 4.0