Pengurutan Cepat dan Penerapannya · Pelajaran 9 dari 10
Sort bawaan Python dan kunci pengurutan
8 menit baca · BelajarCode
Dalam program sungguhan, kamu hampir selalu memakai pengurutan bawaan. Python memakai algoritma hibrida turunan merge sort dan insertion sort yang dikenal sebagai Timsort. Algoritma ini O(n log n), stabil, dan sangat cepat untuk data yang sebagian sudah urut.
sorted dan sort
1nilai = [72, 85, 64, 91]2urut = sorted(nilai)3print(urut, nilai)4nilai.sort(reverse=True)5print(nilai)[64, 72, 85, 91] [72, 85, 64, 91] [91, 85, 72, 64]
sorted(data)membuat list baru dan tidak mengubah aslinya. Bisa dipakai untuk string, tuple, dan koleksi lain.data.sort()mengurutkan list itu sendiri dan mengembalikanNone.
Kunci pengurutan
Parameter key menerima fungsi yang menentukan apa yang dibandingkan.
1siswa = [("Citra", 85), ("Andi", 92), ("Bela", 85), ("Dimas", 78)]2print(sorted(siswa, key=lambda s: s[1], reverse=True))3print(sorted(["jeruk", "Apel", "mangga", "Belimbing"], key=str.lower))[('Andi', 92), ('Citra', 85), ('Bela', 85), ('Dimas', 78)]
['Apel', 'Belimbing', 'jeruk', 'mangga']Tanpa key=str.lower, huruf besar diurutkan sebelum semua huruf kecil, sehingga "Apel" dan "Belimbing" berada di depan "jeruk" karena alasan yang salah.
Beberapa kriteria sekaligus
Jika kunci berupa tuple, Python membandingkan elemen pertama dulu, lalu elemen kedua jika yang pertama sama. Untuk mengurutkan nilai dari besar ke kecil tetapi nama dari A ke Z, nilai dijadikan negatif:
1siswa = [("Citra", 85), ("Andi", 92), ("Bela", 85), ("Dimas", 78)]2peringkat = sorted(siswa, key=lambda s: (-s[1], s[0]))3for posisi, (nama, nilai) in enumerate(peringkat, start=1):4 print(posisi, nama, nilai)1 Andi 92 2 Bela 85 3 Citra 85 4 Dimas 78
Memanfaatkan sifat stabil
Karena pengurutan Python stabil, kamu juga bisa mengurutkan dua kali: mulai dari kriteria yang paling tidak penting.
1siswa = [("Citra", 85), ("Andi", 92), ("Bela", 85), ("Dimas", 78)]2siswa.sort(key=lambda s: s[0])3siswa.sort(key=lambda s: s[1], reverse=True)4print(siswa)[('Andi', 92), ('Bela', 85), ('Citra', 85), ('Dimas', 78)]Pengurutan kedua tidak merusak urutan nama untuk nilai yang sama, karena stabil.
Cek pemahaman
Apa yang dikembalikan oleh [3, 1, 2].sort()?
Latihan
Urutkan peserta lomba
Urutkan peserta lomba berdasarkan skor tertinggi. Jika skornya sama, yang waktunya lebih cepat (detik lebih kecil) di depan. Data: Andi (90, 120 detik), Bela (95, 150 detik), Citra (90, 100 detik), Dimas (95, 140 detik).
Pembahasan
1peserta = [("Andi", 90, 120), ("Bela", 95, 150), ("Citra", 90, 100), ("Dimas", 95, 140)]2hasil = sorted(peserta, key=lambda p: (-p[1], p[2]))3for posisi, (nama, skor, waktu) in enumerate(hasil, start=1):4 print(f"{posisi}. {nama} skor {skor}, {waktu} detik")1. Dimas skor 95, 140 detik 2. Bela skor 95, 150 detik 3. Citra skor 90, 100 detik 4. Andi skor 90, 120 detik
Skor dibuat negatif supaya urut dari besar ke kecil, sedangkan waktu tetap positif supaya yang lebih cepat di depan.
Jalankan contoh kode di pelajaran ini tanpa instalasi lewat compiler Python online.