基本排序之插入排序

Posted Super_J

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基本排序之插入排序相关的知识,希望对你有一定的参考价值。

插入排序:

概述:

(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;
}

 

以上是关于基本排序之插入排序的主要内容,如果未能解决你的问题,请参考以下文章

数据结构排序之插入排序

基本排序算法之——插入排序

7种基本排序算法的Java实现

排序算法之希尔排序

排序算法之插入排序

图解排序算法之希尔排序