Tema
/
Algoritmai ir duomenų struktūros GO
Pamoka 8 / 15 Efektyvus rūšiavimas ~60 min
Kodas

dcsort.go — karkasas

Sukurk dcsort.go (žr. dešinėje). Keturi parašai, keturios sutartys, keturi panic.

Trys iš keturių yra tas pats greitasis rikiavimas su skirtingu pivotu, tad Partition parašysi vieną kartą ir panaudosi tris.

Ką testas tikrins

  • MergeSort — stabilus, negrąžina to paties masyvo (įvestis nekeičiama), ir neviršija n·⌈log₂ n⌉ palyginimų nė vienai tvarkai;
  • QuickSortNaive — surikiuotiems duomenims lygiai n(n−1)/2 palyginimų. Testas reikalauja būtent šito skaičiaus, nes klaida čia yra pamoka;
  • QuickSortMedian3 — surikiuotiems duomenims gerokai mažiau nei kvadratas;
  • QuickSortRandom — sėkla fiksuota (rand.NewSource(1)), kad skaičiai kartotųsi.

Vienas dalykas, kurį lengva praleisti

MergeSort grąžina naują masyvą, o ne rikiuoja vietoje. Testas tikrina, kad įvestis liktų nepaliesta.

Tai ne kaprizas — tai suliejimo rikiavimo kaina. Jam reikia vietos suliejimui, ir ta vieta yra n papildomų elementų. Greitasis rikiavimas jos nereikalauja, ir 7 žingsnyje pamatysi, kad būtent dėl to jis dažnai greitesnis, nors palyginimų atlieka daugiau.