Shell saralash algoritmi
Shell saralash (Shell Sort) — bu qo'shish orqali saralash (Insertion Sort) algoritmining umumlashtirilgan va ancha tezlashtirilgan variantidir. Dastlab bir-biridan uzoqda joylashgan elementlar saralanadi, so'ngra qadam-baqadam elementlar orasidagi interval (oraliq masofa) qisqartirib boriladi.
Oraliq masofani qisqartirish uchun turli ketma-ketliklardan foydalaniladi. Shell saralashida ishlatiladigan mashhur oraliq ketma-ketliklari:
N/2, N/4, ..., 11, 4, 13, ..., (3^k - 1) / 21, 8, 23, 77, 281, 1073, ...1, 3, 7, 15, 31, 63, 127, 255, 511, ...1, 3, 5, 9, 17, 33, 65, ...1, 2, 3, 4, 6, 9, 8, 12, 18, 27, ...[!NOTE] Shell saralashining amaliy samaradorligi va tezligi tanlangan oraliq ketma-ketligiga bevosita bog'liqdir.
Keling, quyidagi massivni Shell'ning asl ketma-ketligi (N/2, N/4, ..., 1) orqali saralashni tahlil qilamiz:

Dastlabki massiv (Initial array)
N = 8. Birinchi qadamda interval = N / 2 = 4 oraliqda joylashgan elementlar o'zaro taqqoslanadi va agar ular noto'g'ri tartibda bo'lsa, o'rinlari almashtiriladi:
0-indeksdagi element 4-indeksdagi bilan taqqoslanadi.0-element kattaroq bo'lsa, ularning o'rni almashtiriladi.
n/2 (4) oraliqdagi elementlarni qayta tartiblash
Bu jarayon 4 oraliqdagi barcha qolgan elementlar uchun takrorlanadi:

n/2 oraliqdagi barcha elementlar tartiblandi
N / 4 = 8 / 4 = 2 ga teng bo'ladi va 2 ta qadam masofadagi elementlar saralanadi:
n/4 (2) oraliqdagi elementlarni qayta tartiblash
Bu yerda 4- va 2-o'rindagi elementlar, shuningdek 2- va 0-o'rindagi elementlar taqqoslanadi. Hozirgi intervalda turgan barcha elementlar zanjir bo'ylab tekshiriladi:

Joriy oraliqda joylashgan barcha elementlar taqqoslanadi
Jarayon qolgan elementlar bo'yicha ham davom ettiriladi:

n/4 oraliqdagi barcha elementlar qayta tartiblandi
N / 8 = 8 / 8 = 1 bo'lganda, oddiy Insertion Sort kabi qo'shni elementlar saralanadi. Lekin avvalgi qadamlar tufayli massiv deyarli saralangan holatga kelib qolganligi sababli, oxirgi bosqich juda oz sonli almashtirishlar bilan bir zumda yakunlanadi:
n/8 (1) oraliqda yakuniy tartiblash va to'liq saralangan massiv
shellSort(array, size)
for interval i <- size / 2 down to 1 (har qadamda i /= 2)
for each interval "i" in array
sort all elements at interval "i" using insertion sort
end shellSort
// Go tilida Shell Sort algoritmi
package main
import "fmt"
func shellSort(arr []int) {
n := len(arr)
// n/2, n/4, n/8, ... 1 oraliqlar bo'yicha qisqartirib boramiz
for interval := n / 2; interval > 0; interval /= 2 {
for i := interval; i < n; i++ {
temp := arr[i]
j := i
// interval masofadagi elementlarni o'rniga suramiz
for j >= interval && arr[j-interval] > temp {
arr[j] = arr[j-interval]
j -= interval
}
arr[j] = temp
}
}
}
func main() {
data := []int{9, 8, 3, 7, 5, 6, 4, 1}
fmt.Println("Dastlabki massiv:", data)
shellSort(data)
fmt.Println("Saralangan massiv:", data)
}| Ko'rsatkich | Murakkablik |
|---|---|
| Eng yaxshi holat (Best Case) | O(n log n) |
| Eng yomon holat (Worst Case) | O(n^2) |
| O'rtacha holat (Average Case) | O(n * log(n)) yoki O(n^(1.25)) (oraliqlar ketma-ketligiga bog'liq) |
| Xotira murakkabligi (Space Complexity) | O(1) |
| Barqarorlik (Stability) | Yo'q (Beqaror) |
Shell saralashining murakkabligi tanlangan oraliqlar ketma-ketligiga qarab sezilarli farq qilishi mumkin. Masalan, Pratt ketma-ketligida eng yomon holat murakkabligi O(n * (log n)^2) gacha pasayadi.
O(1) xotirada) tezkor saralashda.