/********************************
*插入排序:最坏情况下,输入数组逆序,时间复杂度O(n^2)
*
* 最好情况下,输入数组正序,时间复杂度O(n)
*
*由于插入排序在输入数组正序的情况下时间复杂度较小因此
*当数组比较小且基本有序的情况下我们可以使用插入排序
*应用:优化排序,可以在快速排序的过程结合插入排序提高效率
*
*此外:在内层循环中,如果我们采用二分查找,效率是否会更高
* 呢?同时又会出现什么问题呢?(提示:该怎么把数组元素整体后移)
* ******************************/
void Insert_Sort(int *ary, int n)//插入排序,数组下标从0开始
{
int i, j, tmp;
for(i = 1; i <= n - 1; ++i) //当前正在插入下标为i的元素,其中0~i-1元素已经是有序的
{
tmp = ary[i];
for(j = i - 1; j >= 0; --j)//寻找插入的位置,从后向前遍历(1、便于数组元素的向后移动;2、保证插入排序的稳定性)
{
if(ary[j] > tmp)
ary[j+1] = ary[j];
else break;///注意1
}
if(j == -1) ///注意2:如果当前要插入的元素比已经有序的数组中的所有元素都小时,j = -1,对此要进行处理
j = 0;
ary[j] = tmp;
}
return;
}
排序算法—插入排序
最新推荐文章于 2022-09-18 08:08:24 发布