插入排序:
概述:
(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;
}