通過設計標識 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++;
}
}
}
複製程式碼