Gnome排序演算法

2021-09-23 21:41:48 字數 3059 閱讀 1118

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**如下:

//

completed on 2014.10.9 10:01

//language: c99

////

//#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**如下:

//

completed on 2014.10.9 10:31

//language: c99

////

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

Gnome擴充套件推薦

sudo aptitude install gnome shell pomodoro1 hide top bar 全屏時自動隱藏頂欄 lock keys 頂欄顯示numlock和capslock的狀態 netspeed 頂欄顯示網速,喜歡簡潔的 net speed也非常不錯 openweather ...

vncviewer 啟動gnome視窗

1.gedit vnc xstartup 2.內容 bin sh uncomment the following two lines for normal desktop unset session manager exec etc x11 xinit xinitrc x etc vnc xstar...