/*①直接插入排序
时间复杂度:o(n^2)
当原来的数组是逆序排列的时候,要移动数据1+2+3+...+(n-1)次,即o(n^2)
当原来的数组是顺序排列的时候,每次都不需要移动数据,直接插入即可,即o(n)
*/
void InsertSort(int* a,int n){
int i;
//n是数组的长度
//进行第一次循环时,是将a[1]上的数据插入到其之前的有序数组中
//进行到第n-2次循环时,是将a[n-1]上的数据(也是最后一个数据)插入到其之前的有序数组中
for (i = 0; i <= n - 2; i++){
int end = i;
//将每次要插入的数据保存起来
//防止进行a[end+1] = a[end]操作时 被覆盖而找不到
int tmp = a[end + 1];
while (end >= 0){
if (a[end] > tmp){
a[end + 1] = a[end];
end--;
}
else{
break;
}
}
/*
1):如果从a[0] 到 a[end]都比 a[end +1]大
则最后end 减为-1,跳出循环,此时在a[0] 即a[end +1]上赋予 tmp
2):如果是在未跳出循环之前 找到了a[end] <= tmp,
则也是在a[end+1] 上赋予 tmp
*/
a[end + 1] = tmp;
}
}
04-26
02-22
5430
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交