插入排序算法 及其二分搜索优化版 C++代码实现 恋上数据结构笔记

复习梗概

插入排序算法思想

想象插入排序就是两只手,一只手里的牌是有序的,一只是无序的,每次把无序的手里的牌的第一张,与有序的牌逐个比较,插入有序牌堆的合适位置
在这里插入图片描述


插入排序时间复杂度与特性(多少,与什么有关?)

  1. 插入排序的时间复杂度: 与数组中的逆序对有关
  2. 逆序对:比如想要递增的数组【0,8,9,1】这里【8,1】【9,1】都是逆序对
  3. 最坏时间复杂度:O(n2)(输入数组完全逆序),最好时间复杂度O(n)(输入数组已经有序),平均时间复杂度O(n2),空间复杂度O(1)
  4. 即使应用了二分搜索优化,时间复杂度还是O(n2),因为避不开要挪元素腾位置插入
  5. 属于原地稳定排序算法
  6. 排序算法在逆序对特别少的数组中效率很高,甚至可能比O(nlogn)级别的堆排序和快速排序还快
    在这里插入图片描述

插入排序基础版

void insertionSort1th(vector<int> &array) //这里以数组左侧作为有序的那一边
{
   
    // chaosBeginIndex:未排序序列的起始元素下标
    // insertEIndex:拿去插入有序序列的那个元素的下标,就是未排序序列的起始元素,但随着交换位置,下标会改变
    for (int chaosBeginIndex = 1; chaosBeginIndex < array.size(); chaosBeginIndex++) 
    //外循环控制从第二个元素开始插入到有序序列里,直到最后一个元素
    {
   
        for (int insertEIndex = chaosBeginIndex; insertEIndex > 0; insertEIndex--)
        //内循环控制从未排序序列的首元素开始,逐渐与有序序列元素比较和交换位置,找到有序序列中的合适位置
        {
   
            if (array[insertEIndex] < array[insertEIndex - 1])
            {
   
                int temp = array[insertEIndex];
                array[insertEIndex] = array[insertEIndex - 1];
                array[insertEIndex - 1] = temp;
            }
            else
            {
   
                break;
            }
        }
        vectorPrint(array);
    }
}

void insertionSort1thRe(vector<int> &array) //这里以数组右侧作为有序的那一边
{
   
    for (int chaosBeginIndex = array.size() - 1 - 1; chaosBeginIndex >= 0; chaosBeginIndex--)
    {
   
        for (int insertEIndex = chaosBeginIndex; insertEIndex < array.size() - 1; insertEIndex++)
        {
   
            if (array[insertEIndex] > array[insertEIndex + 1])
            {
   
                int temp = array[insertEIndex];
                array[insertEIndex] = array[insertEIndex + 1];
                array[insertEIndex + 1] = temp;
            }
            else
            {
   
                break;
            }
        }
        vectorPrint(array);
    }
}
输入数组:
6 9 3 1 2 0 8 29 15 11 10
插入排序基础版
6 9 3 1 2 0 8 29 15 11 10
3 6 9 1 2 0 8 29 15 11 10
1 3 6 9 2 0 8 29 15 11 10
1 2 3 6 9 0 8 29 15 11 10
0 1 2 3 6 9 8 29 15 11 10
0 1 2 3 6 8 9 29 15 11 10
0 1 2 3 6 8 9 29 15 11 10
0 1 2 3 6 8 9 15 29 11 10
0 1 2 3 6 8 9 11 15 29 10
0 1 2 3 6 8 9 10 11 15 29
算法用时:(微秒)
[AlgoTime: 10002 us]
输入数组:
6 9 3 1 2 0 8 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值