Birinchi qadam – aralashtirish haqida
bu yerda
; keyingi qadamlar – partition
(ajratish) va sort qanday ishlashi haqida batafil tushuntirishga harakat qilaman.
Partition va sort
Aralashtirilgan array:
[5, 0, 10, 14, 9, 7, 12, 11, 2, 4, 1, 3, 6, 8, 13]
Ajratuvchi element –
pivot
‘ni tanlaymiz. Biz arrayni aralashtirganimiz
uchun
birinchi elementning qiymati arraydagi eng katta yoki eng kichik bo’lish ehtimoli
kam. Shu sababli arrayning birinchi elementi indeksini pivot deb olamiz. Demak
array uchun pivot = 0.
Ikki pointerni (elementning indeks nomerini) belgilaymiz. Birinchi pointer i = 1,
ikkinchi pointer – j = array.length – 1 = 14.
i >= j bo’lmaguncha
katta siklni
(O)
ishga tushiramiz.
(a)
Kichkina sikl ichida arr[pivot] > arr[i] shart bajarilishdan to’xtaguncha
yoki i
arrayning ohirgi elementi indeksiga teng bo’lmaguncha i ni oshirib boramiz.
(b)
Yana bir alohida kichkina sikl ichida arr[pivot] < arr[j] shart bajarilishdan
to’xtaguncha yoki j array’ning birinchi elementi indeksiga teng bo’lmaguncha j ni
oshirib boramiz.
(a)
va
(b)
sikllar alohida-alohida (parallel) ishlaydi. Bizning holatda i = 2 va j = 11
da kichkina sikllar to’xtaydi:
[
5
, 0,
10
, 14, 9, 7, 12, 11, 2, 4, 1,
3
, 6, 8, 13]
Sababi arr[pivot] arr[i] dan kichkina bo’lib qoldi va arr[pivot] arr[j] dan katta
bo’lib qoldi. arr[i] va arr[j] o’rnini almashtiramiz:
[
5
, 0, 3, 14, 9, 7, 12, 11, 2, 4, 1, 10, 6, 8, 13]
(O)
katta sikl ishlashda davom etadi. Biz (a) va (b) sikllarni qayta ishga tushiramiz.
Kichkina sikllar i = 3 va j = 10 holatda to’xtaydi.
[
5
, 0, 3,
Dostları ilə paylaş: