考研数据结构编程 ch08 排序 ——插入排序

插入排序


一、算法思想 (按递增排序):

一轮循环

  • 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
十分感谢!!!

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力的clz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值