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

插入排序

时间:2015-05-06 09:15:59      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:插入排序   基本排序算法   

插入排序

今天来看看插入排序是怎么个排发,我觉得插入排序和冒泡有点像,但是又不错的改进。

原理:从一个索引开始,如果它前面的元素值比索引位置值更大,就将前面元素值往后移动一个位置,然后再看更前面的元素,知道找到第一个比索引位置小的元素或数组的头,将索引位置的值填入到当前遍历到的位置。

文字看起来比较抽象,我们来看一下图解
图1:
技术分享

图2:
技术分享

图3:
技术分享

图4:
技术分享

之所以被称为插入排序,就是因为上面的元素是有序的,然后从后面每一个元素要加入到前面的元素中,需要找到自己的位置(找到第一个比自己小的元素),然后插入其中,所以被称为插入排序。不知道我们理解准不准确。

代码:

// 插入排序
void insertSort(int arr[], int len)
{
    int i, j, temp;
    for (i = 1; i < len; ++i)
    {
        temp = arr[i];
        for (j = i; j>0 && arr[j - 1] > temp; j--)
        {
            arr[j] = arr[j - 1];
        }
        arr[j] = temp;
    }
}

很easy吧!插入排序还有一种写法:

// 插入排序第二种形式, 比第一种更慢
void insertSort2(int arr[], int len)
{
    int temp;
    for (int i = 1; i < len; i++)
    {
        for (int j = i; j>0 && arr[j - 1] > arr[j]; j--)
        {
            temp = arr[j];
            arr[j] = arr[j - 1];
            arr[j - 1] = temp;
        }
    }
}

这种写法为什么比第一种更慢呢?
遍历的方式是一样的,关键是赋值的过程。请注意赋值肯定比交换数据是更快的,因为赋值只需要赋一次值,但是如果交换数据的话,需要赋值3次,很明显吧!

插入排序的时间复杂度在虽然相对冒泡有提升,但是最坏的情况也是O(n^2)

插入排序

标签:插入排序   基本排序算法   

原文地址:http://blog.csdn.net/u013647382/article/details/45530445

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