gnome排序(地精排序),起初由hamid sarbazi-azad 於2023年提出,並被稱為stupid排序,後來被dick grune描述並命名為「地精排序」,作為乙個排序演算法,和插入排序類似,除了移動乙個元素到最終的位置,是通過交換一系列的元素實現,就像氣泡排序一樣。概念上十分簡單,不需要巢狀迴圈。時間複雜度為o(n2),但是如果初始數列基本有序,時間複雜度將降為o(n)。實際上gnome演算法可以和插入排序演算法一樣快。平均執行時間為o(n2).
gnome排序演算法總是查詢最開始逆序的一對相鄰數,並交換位置,基於交換兩元素後將引入乙個新的相鄰逆序對,並沒有假定當前位置之後的元素已經有序.
下面gnome排序演算法的偽**,使用0起始索引陣列:
procedure gnomesort(a)
pos := 1
while pos < length(a)
if (a[pos] >= a[pos-1])
pos := pos + 1
else
swap a[pos] and a[pos-1]
if (pos > 1)
pos := pos - 1
end if
end if
end while
end procedure
例項
給定乙個無序陣列, a = [5, 3, 2, 4], gnome排序將在while迴圈中執行如下的步驟. "current position"採用加粗黑體:
當前陣列
操作
[5,3, 2, 4]
a[pos] < a[pos-1], 交換:
[3,5, 2, 4]
a[pos] >= a[pos-1], pos自增:
[3, 5,2, 4]
a[pos] < a[pos-1], 交換並且pos > 1, pos自減:
[3,2, 5, 4]
a[pos] < a[pos-1], 交換並且pos <= 1, pos自增:
[2, 3,5, 4]
a[pos] >= a[pos-1], pos自增:
[2, 3, 5,4]
a[pos] < a[pos-1], 交換並且pos > 1, pos自減:
[2, 3,4, 5]
a[pos] >= a[pos-1], pos自增:
[2, 3, 4,5]
a[pos] >= a[pos-1], pos自增:
[2, 3, 4, 5]
pos == length(a), 完成.
c**如下:
#include#includevoid swap(int *a, int *b) //交換兩元素的值
void printarray(int a, int count) //列印陣列元素
void gnome_sort(int *a, int len) //gnome排序演算法
else
}}int main(void)
; int n = sizeof(a) / sizeof(*a);
printarray(a, n);
gnome_sort(a, n);
printarray(a, n);
return 0;
}
優化:
gnome演算法還可以通過引入乙個變數,用於儲存每次返回到陣列前面的位置來進行優化。採用這樣的優化,gnome排序將成為乙個變種插入排序,下面優化後gnome排序演算法的偽**,使用0起始索引陣列:
procedure optimizedgnomesort(a)
pos := 1
last := 0
while pos < length(a)
if (a[pos] >= a[pos-1])
if (last != 0)
pos := last
last := 0
end if
pos := pos + 1
else
swap a[pos] and a[pos-1]
if (pos > 1)
if (last == 0)
last := pos
end if
pos := pos - 1
else
pos := pos + 1
end if
end if
end while
end procedure
c**如下:
#include#includevoid swap(int *a, int *b) //交換兩元素的值
void printarray(int a, int count) //列印陣列元素
void optimizedgnome_sort(int *a, int len) //優化後的gnome排序
pos++;
} else else }}
}
int main(void)
; int n = sizeof(a) / sizeof(*a);
printarray(a, n);
optimizedgnome_sort(a, n);
printarray(a, n);
return 0;
}
排序演算法之地精排序
地精排序是最簡單的排序演算法,它只用一重迴圈就可以實現。它也像氣泡排序一樣,相鄰元素之間兩兩進行比較,如果這兩個元素逆序,則交換。與氣泡排序不同的是,它如果遇到交換操作時,變為向前冒泡,直至不發生交換操作位置。相當於做了乙個插入操作,將比較小的數插入到前面的有序序列中合適的位置。所以,地精排序可以說...
排序演算法之地精排序
地精排序是最簡單的排序演算法,它只用一重迴圈就可以實現。它也像氣泡排序一樣,相鄰元素之間兩兩進行比較,如果這兩個元素逆序,則交換。與氣泡排序不同的是,它如果遇到交換操作時,變為向前冒泡,直至不發生交換操作位置。相當於做了乙個插入操作,將比較小的數插入到前面的有序序列中合適的位置。所以,地精排序可以說...
Gnome排序演算法
gnome排序 地精排序 起初由hamid sarbazi azad 於2000年提出,並被稱為stupid排序,後來被dick grune描述並命名為 地精排序 作為乙個排序演算法,和插入排序類似,除了移動乙個元素到最終的位置,是通過交換一系列的元素實現,就像氣泡排序一 樣。概念上十分簡單,不需要...