直接插入排序(C)
直接插入排序
算法描述
所谓直接插入排序,就是从插入第1个数值开始(存在第0位),直至插入第n个数值(当插入第n个数值时,前面n-1个数值已经是排好序的),插入完第n个数值时排序结束。
假设:数据集合为N, 有n个数据, i = 1 为第1个数值
第一步: 插入N【1】,比较与 N【0】的大小,若N【0】大于N【1】,N【0】后移,N【1】插入到N【0】位置,即: N【0】> N【1】,{ tmp = N【1】;N【1】= N【0】;N【0】= N【1】}
第二步:插入第 i 个数值N【i】,比较与N【i-1】的大小, 若N【i-1】大于N【i】,N【i-1】后移一位,原数值N【i】继续与前面 i-1 个数值依次比较,大于N【i】的后移一位,直至遍历完前面(i-1)个数值或者前面的数值小于原N【i】,将原N【i】插入前(i-1)个位置中的空出位置。
第三步:此排序为顺序排序,即大的向后移位,小的向前插入,当N【i-1】不大于N【i】时,无需进行插入,向后遍历N【i++】即可,直到n结束。
示例代码
结合上面的分析,用C实现一下直接插入排序:
void Insert_Sort(int N[], int length)
{
int i, j, temp;
for(i = 1; i < length; i++) {
if(N[i-1] > N[i]) {
temp = N[i]; // 临时保存N【i】的数值,以备与前i-1个数值比较
N[i] = N[i-1]; // 将N【i-1】后移一位
for(j = i -1; j >= 0 && N[j] > temp; j--) {
N[j+1] = N[j]; // 将N【j】后移一位
}
N[j+1] = temp; // 将原始N【i】插入,完成一次插入排序
}
}
}
测试结果:输入N【10】= {9 ,3, 3,8, 1, 0, 0, 2, 5, 4}
算法复杂度
空间复杂度:该算法只需要定义一个temp临时变量,因此空间复杂度为 O(1)
时间复杂度:最好情形,该集合已排序,只需遍历比较 n - 1 次,不需要移动元素位置;最坏情形,每次插入N【i】, 需要与前面 i 个记录都比较一次,为 n * (n - 1) / 2 ,在第 i 次排序时,移动记录的次数为 i+1,求和得出时间复杂度为 O(n^2)。
以上为作者本人对于直接插入排序的理解及记录,之后继续总结其他排序算法,加油 ^ _ ^
所有博客均在CSDN首发 Caso_卡索 https://blog.csdn.net/xiaoma_2018