插入排序
一、算法思想 (按递增排序):
一轮循环
- 1、从第2个元素a[1]开始循环到头(第n个)。
// ! 插入排序
void InsertSort(int arrList[], int n)
{
int temp, i, j;
for (i = 1; i < n; i++)
{
……
}
}
- 2、每轮循环,会和前一个元素对比。(也正是和前一个对比,才从第2个元素开始循环)。
- 3、第i轮循环,判断是否比前一个元素值小,(a[i] < a[i-1]),注意,不要使用<=!!! 这样会使得算法不稳定。(所谓算法的稳定性,就是说排序之后的数组,关键字相同的两个元素,保持和之前一样的相对前后顺序)。
- 4、要先清楚一件事,如果循环到a[8],那么从a[0]到a[7]都是排序好的(递增)。那么此时a[8] < a[7],我们现价段的目标就是从 a[7] -> a[0],找最近的比a[8]小的元素。
// ! 插入排序
void InsertSort(int arrList[], int n)
{
int temp, i, j;
for (i = 1; i < n; i++)
{
if (arrList[i] < arrList[i - 1])
{
……
}
}
}
- 5、当a[i] < a[i-1]时,暂时把a[i]这个 异类 先存储起来(temp=a[i];),然后二级循环从 j=i-1 开始往a[0]遍历。
二轮循环:
- 1、最小只能到a[0];
- 2、a[j] > temp (为了找比temp小的元素,找到了循环也就结束了)
- 3、每轮循环,元素后移
// ! 插入排序
void InsertSort(int arrList[], int n)
{
int temp, i, j;
for (i = 1; i < n; i++)
{
if (arrList[i] < arrList[i - 1])
{
temp = arrList[i];
for (j = i - 1; j >= 0 && arrList[j] > temp; --j)
{
arrList[j + 1] = arrList[j];
}
arrList[j + 1] = temp;
}
}
}
二、演示动画
三、具体测试代码
#include <iostream>
using namespace std;
// ! 直接插入排序
void InsertSort(int arrList[], int n)
{
int temp, i, j;
for (i = 1; i < n; i++)
{
if (arrList[i] < arrList[i - 1])
{
temp = arrList[i];
for (j = i - 1; j >= 0 && arrList[j] > temp; --j)
{
arrList[j + 1] = arrList[j];
}
arrList[j + 1] = temp;
}
}
}
int main()
{
int a[] = {38, 49, 65, 97, 76, 13, 27, 49}; // ! 数组从a[0]开始
InsertSort(a, 8);
cout << "数组的元素个数: " << sizeof(a) / 4 << endl;
for (int i = 0; i < 8; i++)
{
cout << "a[" << i << "]: " << a[i] << " ";
}
return 0;
}
本篇博客参考文章:插入排序https://www.cnblogs.com/coding-996/p/12275710.html
十分感谢!!!