Berikut adalah pola yang cukup umum untuk menyortir algoritma:
def sort(l):
while not is_sorted(l):
choose indices i, j
assert i < j
if l[i] > l[j]:
l[i], l[j] = l[j], l[i]
Algoritma ini bekerja dengan baik karena indeks i
dan j
dipilih dengan hati-hati, berdasarkan keadaan daftar l
.
Namun, bagaimana jika kita tidak bisa melihat l
, dan hanya harus memilih secara membabi buta? Seberapa cepat kita bisa mengurutkan daftar itu?
Tantangan Anda adalah menulis fungsi yang menghasilkan pasangan indeks acak, hanya diberi panjang l
. Khususnya, Anda harus menampilkan dua indeks i, j
,, dengan 0 <= i < j < len(l)
. Fungsi Anda harus bekerja pada daftar panjang mana pun, tetapi akan dicetak pada daftar panjang 100.
Skor Anda adalah jumlah rata-rata pilihan indeks yang diperlukan untuk mengurutkan daftar acak acak menurut pola di atas, di mana indeks dipilih sesuai dengan fungsi Anda.
Saya akan menilai pengiriman, dengan mengambil jumlah rata-rata pilihan indeks lebih dari 1000 percobaan pada daftar panjang acak 100 acak tanpa acak entri.
Saya berhak menjalankan uji coba lebih sedikit jika pengajuannya jelas tidak kompetitif atau tidak berakhir, dan saya akan menjalankan lebih banyak uji coba untuk membedakan pesaing teratas untuk menemukan pemenang tunggal. Jika beberapa pengajuan teratas tetap berada dalam margin of error pada batas sumber daya komputasi saya, saya akan menyatakan pengajuan sebelumnya pemenang, sampai sumber daya komputasi lebih lanjut dapat dibawa untuk menanggung.
Berikut ini contoh program penilaian, dengan Python:
import random
def is_sorted(l):
for x in range(len(l)-1):
if l[x] > l[x+1]:
return False
return True
def score(length, index_chooser):
steps = 0
l = list(range(length))
random.shuffle(l)
while not is_sorted(l):
i, j = index_chooser(length)
assert (i < j)
if l[i] > l[j]:
l[i], l[j] = l[j], l[i]
steps += 1
return steps
Fungsi Anda mungkin tidak mempertahankan status yang dapat berubah, berinteraksi dengan variabel global, memengaruhi daftar l
, dll. Input fungsi Anda hanya boleh sepanjang daftar l
, dan itu harus menampilkan sepasang bilangan bulat yang terurut dalam rentang [0, len(l)-1]
(atau sesuai untuk bahasa Anda daftar pengindeksan). Jangan ragu untuk bertanya apakah ada yang diizinkan dalam komentar.
Pengajuan mungkin dalam bahasa bebas untuk digunakan. Harap sertakan harness penilaian jika belum diposkan untuk bahasa Anda. Anda dapat memposting skor sementara, tetapi saya akan meninggalkan komentar dengan skor resmi.
Penilaian adalah jumlah rata-rata langkah-langkah ke daftar yang diurutkan pada daftar panjang acak 100 acak. Semoga berhasil.
sumber
Jawaban:
Python, skor = 4508
Half-Life 3 dikonfirmasi.
Python, skor = 11009
Rupanya semacam gelembung acak tidak melakukan semua yang jauh lebih buruk daripada jenis gelembung normal.
Distribusi optimal untuk panjang kecil
Tidak mungkin ini bisa diperpanjang ke panjang 100, tetapi menarik untuk dilihat pula. Saya menghitung distribusi optimal untuk kasus-kasus kecil (panjang ≤ 7) menggunakan gradient descent dan banyak aljabar matriks. Kolom k th menunjukkan probabilitas setiap swap pada jarak k .
sumber
h
jarak antara elemen yang ditukar; itu tidak mewakili bagian depan atau belakang.Nilai: 4627
Cobalah online!
Menghasilkan indeks acak yang jaraknya dipilih secara seragam
[1,1,4,16]
. Idenya adalah untuk memiliki campuran swap 1 langkah dengan swap pada skala yang lebih besar.Saya men-tweak nilai-nilai ini untuk daftar panjang 100, dan mereka kemungkinan jauh dari optimal. Beberapa pencarian mesin mungkin dapat mengoptimalkan distribusi jarak untuk strategi acak-pasangan-dengan-dipilih-jarak.
sumber
Nilai: 28493
Cobalah online!
Solusi ini hanya memilih nilai yang berbeda untuk
x
dany
secara acak dari rentang dan mengembalikannya dalam urutan yang diurutkan. Sejauh yang saya tahu, ini berkinerja lebih baik daripada memilihx
kemudian memilihy
dari nilai yang tersisa.sumber
Python, skor: 39525
Cobalah online.
sumber
Python, skor ≈ 5000
Dicoba dengan banyak nilai epsilon, 0,25 tampaknya menjadi yang terbaik.
Skor ≈ 8881
Pendekatan yang berbeda. Tidak sebagus itu, dan mati mengerikan dengan panjang tidak dibagi dengan jumlah segmen, tetapi masih menyenangkan untuk dibangun.
sumber
Nilai: 4583
Cobalah online!
Saya tidak tahu kenapa. Saya baru saja mencoba urutan yang terdaftar di wikipedia artical untuk shellsort . Dan yang ini tampaknya paling berhasil. Itu mendapatkan skor yang sama dengan yang diposting .
sumber
candidates
keluar dari fungsi sebagai variabel global harus berfungsi.Python 2 , 4871
Cobalah online!
sumber