今天来看看插入排序是怎么个排发,我觉得插入排序和冒泡有点像,但是又不错的改进。
原理:从一个索引开始,如果它前面的元素值比索引位置值更大,就将前面元素值往后移动一个位置,然后再看更前面的元素,知道找到第一个比索引位置小的元素或数组的头,将索引位置的值填入到当前遍历到的位置。
文字看起来比较抽象,我们来看一下图解:
图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