Saya seharusnya mengurutkan daftar angka, tapi saya sangat malas. Sangat sulit untuk mencari cara menukar semua angka di sekitar sampai semuanya dalam urutan meningkat, jadi saya datang dengan algoritma saya sendiri yang akan menjamin bahwa daftar baru diurutkan¹. Begini cara kerjanya:
Untuk daftar ukuran N , kita perlu iterasi N-1 . Pada setiap iterasi,
Periksa apakah nomor ke- N lebih kecil dari nomor ke-1. Jika ya, maka kedua angka ini sudah diurutkan, dan kita dapat melewati iterasi ini.
Jika tidak, maka Anda harus terus mengurangi angka N pertama hingga kedua angka ini berurutan.
Mari kita ambil contoh konkret. Katakanlah input tadi
10 5 7 6 1
Pada iterasi pertama, kami akan membandingkan 10 dan 5. 10 lebih besar dari 5, jadi kami menurunkannya hingga lebih kecil:
4 5 7 6 1
Sekarang kita membandingkan 5 dan 7. 5 lebih kecil dari 7, jadi kita tidak perlu melakukan apa pun pada iterasi ini. Jadi kita pergi ke yang berikutnya dan membandingkan 7 dan 6. 7 lebih besar dari 6, jadi kami mengurangi tiga angka pertama sampai lebih kecil dari 6, dan kami mendapatkan ini:
2 3 5 6 1
Sekarang kita membandingkan 6 dan 1. Sekali lagi, 6 lebih besar dari 1, jadi kita mengurangi empat angka pertama sampai lebih kecil dari 1, dan kita mendapatkan ini:
-4 -3 -1 0 1
Dan kita selesai! Sekarang daftar kami dalam urutan sempurna. Dan, untuk membuat segalanya lebih baik, kami hanya perlu mengulangi daftar N-1 kali, jadi algoritma ini mengurutkan daftar dalam waktu O (N-1) , yang saya cukup yakin adalah algoritma tercepat yang ada.²
Tantangan Anda untuk hari ini adalah mengimplementasikan Sort Malas ini. Program atau fungsi Anda akan diberi array bilangan bulat dalam format standar apa pun yang Anda suka, dan Anda harus melakukan sortir malas ini dan mengembalikan daftar " sortir " yang baru . Array tidak akan pernah kosong atau mengandung non-integer.
Berikut ini beberapa contohnya:
Input: 10 5 7 6 1
Output: -4 -3 -1 0 1
Input: 3 2 1
Output: -1 0 1
Input: 1 2 3
Output: 1 2 3
Input: 19
Output: 19
Input: 1 1 1 1 1 1 1 1 1
Output: -7 -6 -5 -4 -3 -2 -1 0 1
Input: 5 7 11 6 16 2 9 16 6 16
Output: -27 -25 -21 -20 -10 -9 -2 5 6 16
Input: -8 17 9 7
Output: -20 5 6 7
Seperti biasa, ini kode-golf , jadi tulislah program sesingkat mungkin!
¹ Ini tidak berarti seperti apa artinya, tetapi secara teknis itu benar
² Saya benar-benar bercanda, tolong jangan benci saya
<sarcasm>
Algoritma pengurutan ini sebenarnya masih O(N^2)
memiliki kompleksitas waktu karena Anda harus memeriksa semua item yang sebelumnya diakses pada daftar untuk mengurangi mereka. Saya sarankan menelusuri daftar mundur sebagai gantinya dan mengurangi hanya satu nomor per langkah yang diperlukan. Ini akan memberi Anda O(N)
kompleksitas sejati ! </sarcasm>
O(n^2)
dalam hal akses memori, tetapi bukankah itu O(n)
untuk perbandingan?
O(N^2)
.