算法--插入排序
代码
void insertion sort(Type* a,int n)
{Type key;for (int i = ; i < n; i++){key = a[i];int j = i - 1;while(i >= 0 && a[i] > key){a[j+1] = a[j];j--;}a[j+1]=key;}
}
解释
假设有一个数组a = {5,2,4,6,1,3},
第一次循环(i = 1)
- key = a[1] = 2; j = i - 1 = 0.
- 进入while 循环:判断 j >= 0 && a[j] > key (既 0 >= 0 && 5 > 2),条件成立。
- 执行a[j + 1] = a[j]; ,也就是a[1] = a[0],此时数组变为{5,5,4,6,1,3}
- 执行j–;,j变为-1,while循环结束。
- 执行a[j + 1] = key;,此时 j = -1,所以 j + 1 = 0,既 a[0] = 2.现在数组变为{2,5,4,6,1,3},"已排序部分[2,5]"是有序的
第二次循环(i = 2) - key = a[2] = 4; j = i - 1 = 1.
- 进入while 循环:判断 j >= 0 && a[j] > key (既 0 >= 0 && 5 > 2),条件成立。
- 执行a[j + 1] = a[j]; ,也就是a[2] = a[1],此时数组变为{2,5,5,6,1,3}
- 执行j–;,j变为 0,再次判断while条件; 0 >= 0 && a[0] > 4不成立,循环结束。
- 执行a[j + 1] = key;,此时 j = 0,所以 j + 1 = 1,既 a[1] = 4.现在数组变为{2,4,5,6,1,3},"已排序部分[2,4,5]"是有序的。
。。。。。。。。。。。。。。。。
如果while循环里要执行多次就每次将大的数复制到后面,就会覆盖之前复制的数字。例如
a = {1,2,4,5,6,3}要将3排序
1.{1,2,4,5,6,6}->{1,2,4,5,5,6}->{1,2,4,4,5,6}->{1,2,3,4,5,6,}
要排序的值一直在临时变量中。