码迷,mamicode.com
首页 > 编程语言 > 详细

基本排序之插入排序

时间:2018-01-24 22:05:54      阅读:104      评论:0      收藏:0      [点我收藏+]

标签:str   16px   alt   stream   blog   ack   strong   图片   使用   

插入排序:

概述:

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

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

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

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

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

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

技术分享图片

 

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

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

以此类推。

 

稳定性:

稳定算法。

时间复杂度:

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

代码:

 

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

 

基本排序之插入排序

标签:str   16px   alt   stream   blog   ack   strong   图片   使用   

原文地址:https://www.cnblogs.com/love-jelly-pig/p/8343374.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!