Gnome排序(地精排序)

2021-07-24 18:07:46 字數 2980 閱讀 3648

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描述並命名為 地精排序 作為乙個排序演算法,和插入排序類似,除了移動乙個元素到最終的位置,是通過交換一系列的元素實現,就像氣泡排序一 樣。概念上十分簡單,不需要...