此前的一些博文分别写了C语言中经典的排序方式,选择排序 冒泡排序 桶排序,此文就写 插入排序吧。
相对于冒泡排序,插入排序就比较方便快捷了。和冒泡 选择排序一样,插入排序也需要比较大小。可以这样理解插入排序,是由一个有序的数组中元素与给出的无序数组元素进行逐一的比较,无序就是我们要进行排序的数组,当所有我们进行排序中的元素都比较完后,祖师有序的数组就是我们要的排序结果。
进一步说,好比有两个相同空间的数组 一个数组就是我们要进行排序的无序数组 另一个就是我们排序好的有序数组 。初始时,这个有序数组是空的,此中的元素就是从无序数组取来。从无序数组中依次取出一个元素来与有序数组中的元素依次比较,当然初始时这个有序数组中是空的(这么理解吧,),就不需要进行了直接放进这个有序的数组中。放入第一个元素后,下一个从无序数组中取出的第二个元素就与这个有序数组中的这一个元素进行比较,如果该无序数组中元素数值比有序数组中元素大,那么此无序数组中的元素就放置在有序数组中这第一个元素的后边,反之则这个位于第一位上的第一个元素就往后移动腾出位置放置比它小的无序数组中的元素。以后从无序数组中依次取出的元素与有序数组中的元素依次进行比较,满足条件就放置数组相应的位置,其它元素也根据情况进行位置移动。这样进行下去,当无序数组中所有的元素都与有序数组元素比较并放置于相应的位置,那么这个有序数组就是我们需要的结果。
本文也是参考此篇博文 http://blog.csdn.net/llzk_/article/details/51628574 此文中有图片可供理解。
此插入排序的C语言代码给出如下(以输入10个元素为例):
#include<stdio.h>
int main(void)
{
int i, j, temp;
int num[100];
for (i = 0; i < 10; i++)
scanf("%d", &num[i]);
for (i = 1; i < 10; i++)
{
temp = num[i];// 从无序数组中依次取出一个元素
j = i - 1; // i-1 即为有序数组最后一个元素(与无序元素相邻)的下标
while (j >= 0 && temp < num[j]) //j >= 0 对其进行边界限制。temp < num[i] 为插入判断条件
{
num[j + 1] = num[j];//若不是合适位置,有序数组元素向后移动
j--;
}
num[j + 1] = temp;//找到满足条件的位置,则将此元素插入对应位置
}
for (i = 0; i < 10; i++)
{
printf("%d ", num[i]);
}
}