通过设计标识 i = 0 ,然后从头开始判断,什么时候 ( i < 4 ) 不成立,什么时候排序结束。
这里的核心点就是 如何控制 i 的值。
第一轮操作「i = 0」
先让 i 自增 1 ,达到值为 1 才开始比较 :
交换前 [ 6 2 4 1 ] 『 i = 0 』
交换后 [ 6 2 4 1 ] 『 i = 1 』
第二轮操作「i = 1」
比较 6 和 2 ,发生交换,只要发生交换 i 就减 1 。
交换前 [ 6 2 4 1 ]『 i = 1 』
交换后 [ 2 6 4 1 ]『 i = 0 』
第三轮操作「i = 0」
i 变成 0 了,啥也不干,自增变成 1 再说。
交换前 [ 2 6 4 1 ]『 i = 0 』
交换后 [ 2 6 4 1 ]『 i = 1 』
第四轮操作「i = 1」
比较 2 和 6 ,不交换,只要不要换就自增 1。
交换前 [ 2 6 4 1 ]『 i = 1 』
交换后 [ 2 6 4 1 ]『 i = 2 』
第五轮操作「i = 2」
比较 6 和 4 ,发生交换,只要发生交换 i 就减 1 。
交换前 [ 2 6 4 1 ]『 i = 2 』
交换后 [ 2 4 6 1 ]『 i = 1 』
第六轮操作「i = 1」
比较 2 和 4 ,不交换,只要不要换就自增 1 。
交换前 [ 2 6 4 1 ]『 i = 1 』
交换后 [ 2 4 6 1 ]『 i = 2 』
第七轮操作「i = 2」
比较 4 和 6 ,不交换,只要不要换就自增 1 。
交换前 [ 2 4 6 1 ]『 i = 2 』
交换后 [ 2 4 6 1 ]『 i = 3 』
第八轮操作「i = 3」
比较 6 和 1 ,发生交换,只要发生交换 i 就减 1 。
交换前 [ 2 4 6 1 ]『 i = 3 』
交换后 [ 2 4 1 6 ]『 i = 2 』
第九轮操作「i = 2」
比较 4 和 1 ,发生交换,只要发生交换 i 就减 1 。
交换前 [ 2 4 1 6 ]『 i = 2 』
交换后 [ 2 1 4 6 ]『 i = 1 』
第十轮操作「i = 1」
比较 2 和 1 ,发生交换,只要发生交换 i 就减 1 。
交换前 [ 2 1 4 6 ]『 i = 1 』
交换后 [ 1 2 4 6 ]『 i = 0 』
第十一轮操作「i = 0」
啥也不干,先让 i 自增1,达到值为 1 才开始真正的比较。
『 i = 1 』时,比较 1 和 2 ,不交换,只要不交换就自增 1 。
『 i = 2 』时,比较 2 和 4 ,不交换,只要不交换就自增 1 。
『 i = 3 』时,比较 4 和 6 ,不交换,只要不交换就自增 1 。
『 i = 4 』时,表达式 ( i < n ) 不成立,排序结束。
顺序输出为 [ 1 2 4 6 ]。
地精排序算法代码
template <class T>
void gnome_sort_1(T data[], int n, bool comparator(T, T)){
int i = 1;
while (i < n){
if (i > 0 && comparator(data[i], data[i-1])){
swap(data[i], data[i-1]);
i--;
}else{
i++;
}
}
}