给定数组arr[] = {5,3,2,4,6,8}; 数组分为左右两波,左边均为有序,右边均为无序。在arr数组中,5放在左边,{3,4,2,6,8}放在右边,无序数据中第一个数3的下标定义为i,i从1号下标开始往后遍历,左边有序的数据中5的下标,定义为j,j = i - 1; 插入排序法的思路,i 从前往后遍历,遍历过程中会比较arr[ i ] 与arr [ j ]的大小,如果arr [ i ] < arr [ j ],就得单独把arr [ i ] 的值拉出来,额外定义一个变量temp来保存arr [ i ] 的值,因为,就像arr数组中,我们把3,下标为 i 的值拉出来后,需要把5,下标为 j 的数拉到 j + 1 ,位置上,如果不把 arr [ i ] 赋值给 temp,那么它的值会被覆盖掉。
所以,插入排序法第一步,定义下标 i , j,如果arr [ i ] < arr [ j ] ,把arr [ i ] 的值拿出来,同时把arr 数组中 j 下标所在的数移到 j + 1; arr [ j + 1 ] = arr [ j ];
在上面这个数组中,假设5和3已经调换位置了,那么2怎么前移两个位置 // 3, 5, 2
假设2的下标为 i ,5 的下标为 j , 2 交给 temp 之后, j 下标位置上的数移到 j + 1 位置的同时,j--
int j = i - 1;
for(; j >= 0; j--){
if(arr[i] < arr[j]){
arr[j+1] = arr [j]; // j 位置上的值移到j + 1; 再次循环时 j--;
}
}
arr[j + 1] = temp; // 保存 i的值
按照上述代码,如果 arr [ i ] > arr [ j ]; 如上述数组,8 > 6 , 不满足条件,不会进入 if 条件框,也就不需要 j-- ; 所以,在for循环里加入判断条件,如果 arr [ i ] > arr [ j ] ;退出循环
代码如下;
void insert(int* arr, int len) {
int temp;
int i, j;
for (int i = 1; i < len; i++) {
temp = arr[i];
j = i - 1;
for ( i - 1; j >= 0; j--) {
if (arr[j] > arr[i]) {
arr[j + 1] = arr[j];
}
else { break; }
}
arr[j + 1] = temp;
}
}
int main() {
int arr[] = {3,2,5,4,6,8};
int len = sizeof(arr) / sizeof(arr[0]);
insert(arr, len);
for (int i = 0; i < len; i++) {
printf("%3d", arr[i]);
}
return 0;
}