插入排序
直接插入排序
直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的纪录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的纪录插入完为止,得到一个新的有序序列。
在这里要注意直接插入排序的前提,是插入到一个已经排好序的有序序列中,这表明,我们在插入一个数之前,必须保证被插入的序列是有序序列。
所以我们在插入之前,要先构造一个有序序列, 所以从第一个参数开始,我们一个一个插入,并且都保证插入后序列为有序序列即可。
所以插入顺序应如下图所示:
那么应该怎么描述以上的过程呢?
其实有很多中方法:
第一种,swap
for(int i = 1;i < n;i++)for(int j = i;j > 0 && a[j-1] > a[j];j--)swap(a[i],a[j]);
但是,这种方法调用swap函数,速度较慢,我们可以使用临时变量来替代swap函数:
int tmp = a[j];a[j] = a[j-1];a[j-1] = tmp;
上面的代码又会在内循环中不停地给变量tmp赋相同的值,所以将临时变量tmp定义提出来。
最终优化过的完整代码如下:
void InsertSort(int* a, size_t n){assert(a);for (int i = 0; i < n-1; ++i){int end = i;int tmp = a[end+1];while (end >= 0 && a[end] > tmp){a[end+
如果觉得《【排序】插入排序 希尔排序 选择排序 冒泡排序 堆排序详解及稳定性分析》对你有帮助,请点赞、收藏,并留下你的观点哦!