zoukankan      html  css  js  c++  java
  • 基本排序之插入排序

    插入排序:

    概述:

    (1) 把第一个元素看成一个已排序的元素(因为只有一个,所以可以看成已经排序好的)。

    (2)用第二个元素和第一个元素比较,如果第二个元素小于第一个元素,那么进行交换。

      用第三个元素和第二个元素比较,如果第三个元素小于第二个元素,那么进行交换。

         交换完毕之后再看,现在的第二个元素是否小于第一个元素,如果小于,那么进行交换。

         以此类推,直至最后一个元素。

    (3)碰到第一个不大于此元素的数时,就不继续往前。

    就和玩扑克牌一样,先拿一张手牌放着,抽第二张牌的时候,如果比第一张小,那么就放在第一张之前。

    再继续抽第三张,如果比第二张小,就往前再比较,如果比第一张小,那么再往前,放在第一张位置处。如果比第一张大,那就停住,放在第二张的地方。

    以此类推。

    稳定性:

    稳定算法。

    时间复杂度:

    如果一个数组是逆序,那么使用插入排序的话,下标i要进行i次的交换,所以最坏的时间复杂度就是(N-1)+(N-2)+...+2+1=N(N-1)/2,故时间复杂度为O(N²)。

    代码:

    #include <iostream>
    using namespace std;
    
    template<typename T>
    void InsertSort(T array[],int length)
    {
        //如果数组为空或者只有一个元素,那么直接返回这个数组即可
        if (length < 2)
            return;
        int i = 0,j = 0;
        //从下标为1的元素开始比较
        for (i = 1; i < length; i++)
        {
            //如果当前元素小于上一个元素,那么就进行交换,并继续比较
            //直到当前元素为下标为0(所以要大于等于1,)
            for (j = i; j >= 1 && array[j] < array[j-1]; j--)
            {
                int temp = array[j];
                array[j] = array[j - 1];
                array[j - 1] = temp;
            }
        }
    }
    
    
    int main()
    {
        int array[10] = {2,54,23,-19,4,0,-12,-1,5,2};
        InsertSort(array, 10);
        for (int i = 0; i < 10; i++)
        {
            cout << array[i] << " ";
        }
        return 0;
    }
  • 相关阅读:
    Conda 使用笔记
    个人日志笔记软件比较
    CMD 命令笔记
    Joplin 资源汇总
    【NAS】Hexo+Github 搭建博客&基础配置
    【NAS】群晖 WordPress 使用记录
    哈工大计组mooc 第四章 中 测试
    下列软件包有未满足的依赖关系:
    安装ubuntu用Ultraiso制作引导盘便捷启动提示:找到多余一个分区
    ros安装caffe anaconda2之后roscore无法执行
  • 原文地址:https://www.cnblogs.com/love-jelly-pig/p/8343374.html
Copyright © 2011-2022 走看看