插入法相对较复杂,基本原理是抽出一个数据,在前面数据中寻找相应的位置插入,然后继续下一个数据,直到排序完成
以9、6、15、4、2为例来进行插入法排序
元素[0] | 元素[1] | 元素[2] | 元素[3] | 元素[4] | |
初始值 | 9 | 6 | 15 | 4 | 2 |
第1次 | 9 | ||||
第2次 |
6 | 9 | |||
第3次 | 6 | 9 | 15 | ||
第4次 | 4 | 6 | 9 | 15 | |
结果 | 2 | 4 | 6 | 9 | 15 |
从表中可知,第一次排序将第一个元素放在首位,然后取出第二元素与其比较,如果小于第一个数则放在第一个数左边,反之则放在右边。以此类推,将元素逐个取出与前面的相比较,直到最后一个元素找到相应的位置放入
下面通过代码实现
#include<>
int main()
{
int arr[10]; /*定义一个10个元素的数组*/
int i,j,temp,pos; /*temp记录最小值,pos记录最小值位置*/
for(i=0;i<=9;i++) /*输入各个数字*/
{
scanf("%d",&arr[i]);
}
for(i=1;i<10;i++) /*从数组的第二个元素开始循环*/
{
temp=arr[i]; /*设置插入值*/
pos=i-1; /*记录插入值前一个位置*/
while(pos>=0&&temp<arr[pos]) /*与前面数逐个比较寻找插入值的位置*/
{
arr[pos+1]=arr[pos]; /*插入数值*/
pos--;
}
arr[pos+1]=temp;
}
for(i=0;i<=9;i++) /*输出排序后的数组*/
{
printf("%d ",arr[i]);
}
return 0;
}
插入法排序共需要进行n-1次取出元素并寻找位置插入,因此当序列较为有序时,插入排序有较快的运算速度