一.插入排序
插入排序有点类似于我们打牌时整理手牌的过程,以左手拿牌,右手起牌为例。左手上面的牌,总是按照从小到大(从大到小)的顺序排列,而右手拿上来的牌则根据大小在左手选择位置插入,从而依旧保证了左手手牌依然是有序的。
由这种思想引申过来,将数组中一串乱序的数字当做待整理的扑克牌,每次抽取一张牌,即每次处理数组中的一个元素,依次整理直到所有元素处理完毕。
下面是插入排序的代码:
void InsertSort(int *Array,int length)
{
int i,j,key;
for(i=1;i<length;i++)
{
key = Array[i];
j = i - 1;
while(j>=0 && Array[j]>key)
{
Array[j+1] = Array[j];
j--;
}
Array[j+1] = key;
}
}
代码流程如下:从数组中第二个元素开始抽取,依次与已排好顺序的部分进行比较,如果抽取的元素较小且此时仍有元素未进行比较,则前移目标继续进行比较,直到找到应插入的位置,或者达到边界为止。
插入排序的优点在于占用空间较小,所有操作都在原数组上进行,即空间复杂度为1.但是时间复杂度不好把握,在最坏的情况下,每次抽取元素都需要遍历一次该元素之前的数组,这时,时间复杂度为n-1+n-2+…+1,即为O(n的平方)。