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.