aber gut, in der schulle nehmen wie sortier algorithmen durch und jeder muss ueber einem einen referat halten.
ich hab das "shakesort"
und habe mit Tkinter ein kleines script geschrieben, welches die funktionsweise von shakersort veranschalulicht.
nicht gerade schoen, aber funzt gut:
feedback willkommen!
EDIT:
zwei unbenutzte varieblen entfernt
Code: Alles auswählen
from Tkinter import *
from time import sleep
import threading
class App(Frame):
def __init__(self, *args, **kw):
Frame.__init__(self, *args, **kw)
self.btn_style = dict(bd=2, activeforeground='red')
self.top = Frame(bg="black")
self.top.grid(row=0, column=0, padx=10, pady=10)
self.entries = []
for i in range(10):
e = Entry(self.top, width=3, bg='#cccccc', justify="center", bd=0, font=("Times", 40, "bold"))
self.entries.append(e)
e.grid(row=0, column=i, pady=3, padx=5)
self.bottom = Frame(self)
self.bottom.grid(row=1, column=0, columnspan=10)
self.btn = Button(self.bottom, command=self._start, text="go!", width=8, **self.btn_style)
self.btn.grid(row=1, column=0)
Button(self.bottom, text="best case", command=self._best_case, **self.btn_style).grid(row=1, column=1)
Button(self.bottom, text="worst case", command=self._worst_case, **self.btn_style).grid(row=1, column=2)
self.wait_time = IntVar(); Scale(self.bottom, from_=1, to=300, orient="horizontal", variable=self.wait_time, bd=0).grid(row=1, column=3)
def _case(self, best):
for c, entr in enumerate(self.entries):
entr.delete(0, END); entr.insert(0, str(c if best else (10-c)))
def _best_case(self): self._case(True)
def _worst_case(self): self._case(False)
def _start(self):
print "start"
self.btn.config(command=self._pause, text="pause")
self.paused = False
threading.Thread(target=self.mk_colored).start()
def _continue(self):
print 'continue'
self.btn.config(command=self._pause, text="pause")
self.paused = False
def mk_colored(self):
i = 0
up = True
while True:
if up:
if i >= len(self.entries)-1:
up = False
continue
i += 1
else:
if i <= 1:
up = True
continue
i -= 1
entr0 = self.entries[i-1]
entr1 = self.entries[i]
entr0.config(bg="red"); entr1.config(bg="red")
wt = self.wait_time.get()/200.0
while self.paused:
sleep(0.15)
sleep(wt); self._cmp_and_swap(self.entries[i-1], self.entries[i]); sleep(wt)
entr0.config(bg="#cccccc"); entr1.config(bg="#cccccc")
def _cmp_and_swap(self, entr0, entr1):
entr0_get = entr0.get()
if entr0_get.isdigit(): entr0_get = int(entr0_get)
entr1_get = entr1.get()
if entr1_get.isdigit(): entr1_get = int(entr1_get)
if entr0_get > entr1_get:
entr0.delete(0, END); entr0.insert(0, entr1_get)
entr1.delete(0, END); entr1.insert(0, entr0_get)
def _pause(self):
print 'pause'
self.btn.config(command=self._continue, text="continue")
self.paused = True
root = Tk()
App(root).grid()
root.mainloop()