基本思想:每一步将一个待排序的数据插入到前面已经排好序的有序序列中,直到插完所有元素为止。
在有序数组中插入当前元素key的时候,从有序数组的最后一个元素开始往前遍历,如果a[i] > key ,则把a[i+1]=a[i],即把比key大的元素以此朝后挪,给key值腾位置,一旦找到有序数组中比key小的元素,那说明key找到自己的位置了,跳出循环,a[i+1] = key,把key值放到找好的位置上去
第1趟:将第2个元素插入前面的有序子序列,此时前面只有一个元素,当然是有序的
第2趟:将第3个元素插入前面的有序子序列,此时前面的2个元素已经是有序的
......
第n-1趟:将第n个元素插入前面的有序子序列,此时前面的n-1个元素已经是有序的
#include <stdio.h>
int main()
{
int n, i, j;
scanf("%d", &n);
int a[n];
int key;
for(i = 0; i < n; i++){
scanf("%d", &a[i]);
}
// 核心思想部分
for(j = 1; j < n; j++){
key = a[j];
i = j - 1;
while(i >= 0 && a[i] > key){
a[i + 1] = a[i];
i--;
}
a[i + 1] = key;
}
for(i = 0; i < n; i++){
printf("%d\n", a[i]);
}
return 0;
}