Pengurutan Cepat dan Penerapannya · Pelajaran 8 dari 10

Quick sort

10 menit baca · BelajarCode

Quick sort juga memakai divide and conquer, tetapi dengan cara berbeda:

  1. Pilih satu data sebagai pivot.
  2. Partisi: pisahkan data menjadi yang lebih kecil dari pivot dan yang lebih besar.
  3. Urutkan kedua bagian dengan quick sort, lalu gabungkan: kecil, pivot, besar.

Versi yang mudah dibaca

Python
1def quick_sort(data):2    if len(data) <= 1:3        return data4    pivot = data[len(data) // 2]5    kecil = [x for x in data if x < pivot]6    sama = [x for x in data if x == pivot]7    besar = [x for x in data if x > pivot]8    return quick_sort(kecil) + sama + quick_sort(besar)910print(quick_sort([33, 10, 55, 71, 29, 3, 18, 42]))
Keluaran
[3, 10, 18, 29, 33, 42, 55, 71]

Versi ini jelas, tetapi membuat banyak list baru. Versi yang dipakai dalam praktik mempartisi di tempat tanpa list tambahan.

Partisi di tempat

Python
1def partisi(data, rendah, tinggi):2    pivot = data[tinggi]3    i = rendah4    for j in range(rendah, tinggi):5        if data[j] < pivot:6            data[i], data[j] = data[j], data[i]7            i += 18    data[i], data[tinggi] = data[tinggi], data[i]9    return i1011def quick_sort_di_tempat(data, rendah=0, tinggi=None):12    if tinggi is None:13        tinggi = len(data) - 114    if rendah < tinggi:15        p = partisi(data, rendah, tinggi)16        quick_sort_di_tempat(data, rendah, p - 1)17        quick_sort_di_tempat(data, p + 1, tinggi)1819angka = [33, 10, 55, 71, 29, 3, 18, 42]20quick_sort_di_tempat(angka)21print(angka)
Keluaran
[3, 10, 18, 29, 33, 42, 55, 71]

Fungsi partisi memindahkan semua data yang lebih kecil dari pivot ke bagian kiri, lalu menaruh pivot tepat setelahnya. Posisi pivot itu sudah final.

Analisis

  • Rata-rata: O(n log n), dan dalam praktik sering lebih cepat dari merge sort karena tidak butuh memori tambahan.
  • Terburuk: O(n²), terjadi jika pivot selalu data terkecil atau terbesar. Pada versi di atas yang memakai data terakhir sebagai pivot, ini terjadi ketika data sudah urut.
  • Solusinya: pilih pivot secara acak, atau ambil median dari data pertama, tengah, dan terakhir.
  • Tidak stabil pada versi di tempat.

Cek pemahaman

Kapan quick sort dengan pivot data terakhir menjadi paling lambat?

Latihan

Pivot acak

Ubah fungsi partisi supaya sebelum memartisi, sebuah posisi acak dipilih dan datanya ditukar dengan data terakhir. Uji pada data yang urut terbalik list(range(10, 0, -1)), salah satu susunan yang membuat versi pivot terakhir menjadi lambat.

Jalankan contoh kode di pelajaran ini tanpa instalasi lewat compiler Python online.

Tandai pelajaran ini selesai

Masuk ke aplikasi untuk mencatat kemajuan, lalu lanjutkan ke pelajaran berikutnya dari perangkat mana pun.

Buka di aplikasi