Di kelas kami melakukan pengurutan algoritma dan, meskipun saya mengerti mereka baik-baik saja ketika berbicara tentang mereka dan menulis pseudocode, saya mengalami masalah dalam menulis kode aktual untuk mereka.
Ini adalah usaha saya di Python:
mylist = [12, 5, 13, 8, 9, 65]
def bubble(badList):
length = len(badList) - 1
unsorted = True
while unsorted:
for element in range(0,length):
unsorted = False
if badList[element] > badList[element + 1]:
hold = badList[element + 1]
badList[element + 1] = badList[element]
badList[element] = hold
print badList
else:
unsorted = True
print bubble(mylist)
Sekarang, ini (sejauh yang saya tahu) dapat diurutkan dengan benar, tetapi setelah selesai, hanya loop tanpa batas.
Bagaimana kode ini diperbaiki sehingga fungsi selesai dengan benar dan benar mengurutkan daftar ukuran apa pun (masuk akal)?
PS Saya tahu saya seharusnya tidak benar-benar memiliki cetakan dalam suatu fungsi dan saya harus kembali, tetapi saya belum melakukan itu karena kode saya belum benar-benar berfungsi.
python
algorithm
sorting
bubble-sort
Josh Hunt
sumber
sumber
Jawaban:
Untuk menjelaskan mengapa skrip Anda tidak berfungsi saat ini, saya akan mengganti nama variabel
unsorted
menjadisorted
.Pada awalnya, daftar Anda belum diurutkan. Tentu saja, kami mengatur
sorted
untukFalse
.Segera setelah kami memulai
while
loop, kami menganggap bahwa daftar sudah diurutkan. Idenya adalah ini: begitu kita menemukan dua elemen yang tidak dalam urutan yang benar, kitasorted
kembali keFalse
.sorted
akan tetapTrue
hanya jika tidak ada elemen dalam urutan yang salah .Ada juga masalah kecil kecil yang akan membantu kode menjadi lebih efisien atau mudah dibaca.
Dalam
for
lingkaran, Anda menggunakan variabelelement
. Secara teknis,element
bukan elemen; itu nomor yang mewakili indeks daftar. Juga, ini cukup panjang. Dalam kasus ini, cukup gunakan nama variabel sementara, sepertii
untuk "indeks".The
range
perintah juga dapat mengambil hanya satu argumen (bernamastop
). Dalam hal ini, Anda mendapatkan daftar semua bilangan bulat dari 0 hingga argumen itu.The Python Style Guide merekomendasikan bahwa variabel diberi nama dalam huruf kecil dengan garis bawah. Ini adalah nitpick yang sangat kecil untuk skrip kecil seperti ini; itu lebih untuk membuat Anda terbiasa dengan apa yang paling mirip dengan kode Python.
Untuk menukar nilai dua variabel, tulislah sebagai tugas tuple. Sisi kanan akan dievaluasi sebagai tupel (katakanlah,
(badList[i+1], badList[i])
adalah(3, 5)
) dan kemudian ditugaskan ke dua variabel di sisi kiri ((badList[i], badList[i+1])
).Kumpulkan semuanya, dan Anda mendapatkan ini:
(Omong-omong, saya menghapus pernyataan cetak Anda.)
sumber
while
loop, elemen terbesar "menggembung" ke akhir daftar. Dengan demikian, setelah satu iterasi, elemen terakhir pasti ada di tempat yang tepat (dan tidak akan tergerak oleh iterasi yang berurutan). Dengan mengurangi 1 dari panjang, Anda mengoptimalkan algoritme dengan hanya mengurutkan sublist yang belum diurutkan (length-n
elemen paling depan dari daftar). Saya memilih untuk melewati optimasi ini, karena ini lebih merupakan optimasi daripada bagian vital dari algoritma.Put it all together, and you get this:
... well, Anda melewatkan yang satu ini:The range command can also take just one argument (named stop).
Tujuan dari semacam bubble adalah untuk memindahkan item yang lebih berat di bagian bawah di setiap putaran, sambil memindahkan item yang lebih ringan ke atas. Di loop dalam, di mana Anda membandingkan elemen, Anda tidak perlu mengulangi seluruh daftar di setiap belokan . Yang terberat sudah ditempatkan terakhir. The bertukar variabel pemeriksaan tambahan sehingga kita bisa menandai bahwa daftar sekarang diurutkan dan menghindari melanjutkan dengan perhitungan yang tidak perlu.
Versi 1 Anda, diperbaiki:
sumber
Inilah yang terjadi ketika Anda menggunakan nama variabel makna negatif, Anda perlu membalikkan nilainya. Berikut ini akan lebih mudah dipahami:
Di sisi lain, logika algoritme sedikit tidak aktif. Anda perlu memeriksa apakah dua elemen bertukar selama for loop. Begini cara saya menulisnya:
sumber
Penggunaan Anda atas variabel Tidak Disortir salah; Anda ingin memiliki variabel yang memberi tahu Anda jika Anda telah bertukar dua elemen; jika Anda telah melakukannya, Anda dapat keluar dari loop, jika tidak, Anda perlu mengulang lagi. Untuk memperbaiki apa yang Anda dapatkan di sini, cukup masukkan "unsorted = false" di badan case Anda; hapus kasus Anda yang lain; dan masukkan "unsorted = true sebelum
for
loop Anda .sumber
sumber
Fungsi #A yang sangat sederhana, dapat dioptimalkan (jelas) dengan mengurangi ruang masalah array ke-2. Tetapi kompleksitas O (n ^ 2) yang sama.
sumber
arr[a], arr[b] = arr[b], arr[a]
Ada beberapa kesalahan di sana. Yang pertama panjang, dan yang kedua dalam penggunaan Anda tidak disortir (seperti yang dinyatakan oleh McWafflestix). Anda mungkin juga ingin mengembalikan daftar jika Anda ingin mencetaknya:
eta: Kamu benar, yang di atas buggy sekali. Saya buruk karena tidak menguji melalui beberapa contoh lagi.
sumber
Saya seorang pemula yang segar, mulai membaca tentang Python kemarin. Terinspirasi oleh teladan Anda, saya menciptakan sesuatu yang mungkin lebih bergaya 80-ties, tapi tetap saja berhasil
sumber
Masalah dengan algoritma asli adalah bahwa jika Anda memiliki angka lebih rendah dalam daftar, itu tidak akan membawanya ke posisi yang diurutkan dengan benar. Program harus kembali ke awal setiap kali untuk memastikan bahwa angka-angka menyortir semua jalan.
Saya menyederhanakan kode dan sekarang akan berfungsi untuk daftar nomor apa pun terlepas dari daftar dan bahkan jika ada nomor yang berulang. Ini kodenya
sumber
sumber
alist = [54,26,93,17,77,31,44,55,20, -23, -34,16,11,11,11]
print bubbleSort (daftar)
sumber
sumber
Contoh sederhana:
Ini hanya mengambil elemen dari 0 ke a (pada dasarnya, semua elemen yang tidak disortir dalam putaran itu) dan membandingkannya dengan elemen yang berdekatan, dan membuat swap jika lebih besar dari elemen yang berdekatan. Pada akhir putaran, elemen terakhir diurutkan, dan proses berjalan lagi tanpanya, sampai semua elemen telah diurutkan.
Tidak perlu untuk suatu kondisi apakah
sort
itu benar atau tidak.Perhatikan bahwa algoritma ini mempertimbangkan posisi angka hanya ketika bertukar, sehingga angka yang diulang tidak akan mempengaruhinya.
PS. Saya tahu sudah sangat lama sejak pertanyaan ini diposting, tetapi saya hanya ingin membagikan ide ini.
sumber
sumber
sumber
sumber
sumber
Saya mempertimbangkan untuk menambahkan solusi saya karena solusi yang pernah ada di sini
maka seharusnya
Jadi, inilah solusi saya:
sumber
Jika ada yang tertarik dengan implementasi yang lebih pendek menggunakan pemahaman daftar:
sumber
Berikut adalah variasi berbeda dari jenis gelembung tanpa
for
loop. Pada dasarnya Anda sedang mempertimbangkanlastIndex
dariarray
dan perlahan-lahandecrementing
itu sampai indeks pertama dari array.The
algorithm
akan terus bergerak melalui array seperti ini sampai seluruh lulus dibuat tanpaswaps
terjadi.Gelembung adalah semacam pada dasarnya
Quadratic Time: O(n²)
ketika datang ke kinerja.sumber
Jawaban yang diberikan oleh the fury dan Martin Cote memperbaiki masalah loop infinite, tetapi kode saya masih tidak berfungsi dengan benar (untuk daftar yang lebih besar, itu tidak akan diurutkan dengan benar.). Saya akhirnya membuang
unsorted
variabel dan menggunakan penghitung.Jika ada yang bisa memberikan petunjuk tentang cara meningkatkan kode saya di komentar, itu akan sangat dihargai.
sumber
Coba ini
sumber
idk jika ini dapat membantu Anda setelah 9 tahun ... ini adalah program semacam gelembung sederhana
sumber
sumber
sumber
sumber
def bubbleSort(a): def swap(x, y): temp = a[x] a[x] = a[y] a[y] = temp #outer loop for j in range(len(a)): #slicing to the center, inner loop, python style for i in range(j, len(a) - j):
#find the min index and swap if a[i] < a[j]: swap(j, i) #find the max index and swap if a[i] > a[len(a) - j - 1]: swap(len(a) - j - 1, i) return a
sumber