概要:
先看图:
第一次插入:从第二个位置开始;2比5小,所有2应该在5的前面,所以2和5交换位置;
第二次插入:3比5小,所有3,应该在5的前面,所以3和5交换位置;然后3比2大,所有2应该在3的前面,所以2和3不交换位置;
第三次插入:然后8比5大,所有5应该在8的前面,所以5和8不交换位置;
第四次插入:7比8小,所有7应该在8的前面,所以7和8交换位置;
就这样依次进行下去;这就是插入排序;
插入排序的基本思想是:
每步将一个待排序的记录,按其值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。
代码:
void insertSort(int arr[], int n) {
int j;
for (int i = 1; i < n; i++) {
//向前将数插入合适位置
for ( j = i; j >= 1 ; j--)
if(a[j]<a[j-1]
swap(arr[j] , arr[j - 1]);
else
break;//为什么可以终止循环,要想到插入排序,一个待插入的数据的前面已经是排好序的了
}
}
插入排序优化:
在上述实例中,我们发现如果满足条件,就会进行一次swap(交换)操作,我们知道,swap(交换)是要进行三次赋值的,这样会降低算法效率,所以我们通过如下方法改善插入排序:
对应这个数组;我们从1的位置开始;先用一个变量记录1的位置的值,接下来看步骤:
先用一个变量记录1的位置的值;
1<8,所以1应该在8的前面,我们将8的位置的后一个位置(也就是1原来的位置)值赋值为8;然后考察1是否放在原来8的位置,
1<7;所以1应该在7的前面,我们将7的位置的后一个位置(也就是8原来的位置)值赋值为7;然后考察1是否放在原来7的位置,
1<6;所以1应该在6的前面,我们将6的位置的后一个位置(也就是7原来的位置)值赋值为6;然后考察1是否放在原来6的位置,
以此类推:进行以下步骤;
最后发现1应该放在2原来的位置;所以此时我们将上面记录的变量的值赋值给2原来的位置;
这样我们就完成了对1的插入;
代码
void insertSort(int arr[], int n) {
int j;
for (int i = 1; i < n; i++) {
int e = arr[i];
for ( j = i; j >= 1 && e<arr[j - 1]; j--)
arr[j] = arr[j - 1];
arr[j] = e;
}
}
优化后的对比:
对于第一种方法:把1插入到合适的位置需要6此的swap(交换),也就是6X3=18次赋值;而对于第二种方法:只需要7次;所以算法的效率肯定是得到了提升的。
总结:
认真领悟,对比,多练习。