インターフェース部品コード
最初に醜いインターフェースQAQを見てください
# - *- coding: utf-8-*-from tkinter import*import datetime
import time
from data_sort import My_Sort
import random
import sys
import re
# ヒルバブリングを挿入して、ヒープソートをすばやく選択します
classApplication(Frame):
def __init__(self,root):"""初期化,さまざまなボタンやテキストボックスを作成する"""
# 番号を格納する番号リストを作成する
self.number =[]
# countは、ソートされる数値の数を記録するために使用されます
self.count =10086
self.my =My_Sort()super(Application,self).__init__(root)
self.grid()
self.root = root
Label(self, text="\t\t").grid(row=0, column=0)Label(self, text="ソートモードを選択してください:",
font ='STXingkai -25 bold', fg ="#30E6FF").grid(row=0, column=1)
# ユーザーがデータソースを選択できるようにするラジオボタンを作成する
self.choose =StringVar()
self.choose.set(None)
self.input_number =Radiobutton(self, text="1手動で番号を入力します", variable=self.choose,
value="右側のダイアログボックスにスペースで区切ってランダムな数字を入力してください",
command=self.update_text,
justify="center",
font='STXingkai -20 bold', fg="#DF4FE7").grid(row=2, column=0, sticky=W)
self.rand_number =Radiobutton(self, text="2ランダムな数値を生成する", variable=self.choose,
value ="下の[ランダム番号の生成]ボタンをクリックしてください",
command = self.update_text,
justify ="center",
font ='STXingkai -20 bold', fg="#DF4FE7").grid(row=3, column=0, sticky=W)
# 各機能のボタンを作成する
self.srand_btn =Button(self, text ="ランダムな数字を生成する",
command = self.create_rand_number
). grid(row=4, column=0, sticky=E,
ipadx="4p", ipady="4p")
self.get_txt_btn =Button(self, text="テキストボックス番号を読む",
command=self.get_Text_number
). grid(row=4, column=1,
ipadx="4p", ipady="4p")
self.exit_btn =Button(self, text="プログラムを終了します", command=self.GuiExit,
foreground="red", font='STXingkai -15 bold',).grid(row=4, column=2, ipadx="4p", ipady="4p")
self.insert_btn =Button(self, text="挿入ソート",
command =self.insert
). grid(row=5, column=0, ipadx="4p", ipady="4p")
self.shell_btn =Button(self, text="ヒルソート",
command = self.shell
). grid(row=5, column=1, ipadx="4p", ipady="4p")
self.buddle_btn =Button(self, text="バブルソート",
command = self.buddle
). grid(row=5, column=2, ipadx="4p", ipady="4p")
self.quick_btn =Button(self, text="クイックソート",
command = self.quick
). grid(row=6, column=0, ipadx="4p", ipady="4p")
self.select_btn =Button(self, text="並べ替えを選択",
command = self.select
). grid(row=6, column=1, ipadx="4p", ipady="4p")
self.heap_btn =Button(self, text="ヒープソート",
command = self.heap
). grid(row=6, column=2, ipadx="4p", ipady="4p")
self.view_gui =Button(self, text="GUIソースコードを表示",command = self.view_gui
). grid(row=7, column=0, ipadx="4p", ipady="4p")
self.view_sort =Button(self, text="ソートソースコードを表示",command = self.view_sort
). grid(row =7, column=1, ipadx="4p", ipady="4p")Label(self, text="\t").grid(row=1, column=2)Label(self, text="入力および出力ボックス:", font='STXingkai -16 ', fg="#F9A728").grid(row=1, column=3)Label(self,text="").grid(row=8,column=0)
self.txt =Label(self, text="", width=37, height=5,borderwidth=2,
foreground="black",background="#E0E0E0",
font='STXingkai -20 ', fg="#4169E1")
self.txt.grid(row=2, column=1, sticky=W)
self.efficiency =Label(self, text="",
width=35,height=10,borderwidth=2,
font='STXingkai -20 ', fg="gray",
background="#C6E2FF")
self.efficiency.grid(row=9, column=1, rowspan=1)
# 入力および出力テキストボックスを作成する
self.output_txt =Text(self, width=60, height=15, wrap=WORD,
font='STXingkai -20 ', border=5, fg="gray")
self.output_txt.grid(row=2, column=4, rowspan=5)
# 出力テキストボックスのスクロールバーを作成します
self.scrollbar =Scrollbar(self)
self.output_txt.configure(yscrollcommand=self.scrollbar.set)
self.scrollbar['command']= self.output_txt.yview
self.scrollbar.set(0.5,1)
self.scrollbar.grid(row=3, column=5)
self.scrollbar.grid_anchor(E)
# ランダムな数字を生成する
def create_rand_number(self):if self.choose.get()=="下の[ランダム番号の生成]ボタンをクリックしてください":for i inrange(self.count):
r = random.randint(-10000,10000)
self.number.append(r)
self.txt['text']="ランダム番号が正常に生成されました"
elif self.choose.get()=="右側のダイアログボックスにスペースで区切ってランダムな数字を入力してください":
self.txt['text']="右側のダイアログボックスにスペースで区切ってランダムな数字を入力してください"else:
self.txt['text']="次のステップに進む前に、モードを選択してください"
# プログラムを終了します
def GuiExit(self):
self.quit()
def update_text(self):"""ラジオボタンの値とテキストコンテンツを更新します"""
message =""
message += self.choose.get()
self.txt['text']= message
if self.choose.get()=="右側のダイアログボックスにスペースで区切ってランダムな数字を入力してください":
self.get_Text_number()
# 入力および出力テキストボックスで番号を取得します
def get_Text_number(self):try:
string = self.output_txt.get(0.0,END)
list = re.split(' ',string)
flag =0for i in list :
num =int(i)
self.number.append(num)
flag +=1
self.count = flag
self.txt['text']="テキストボックスの番号を正常に読み取った"
except:
pass
# 整えます
# 挿入ソート
def insert(self):iflen(self.choose.get())>10:
start = datetime.datetime.now()
self.number = self.my.insert_sort(self.number)
end = datetime.datetime.now()
self.get_effiency_writefile(start,end,name="挿入ソート",text="insert")
self.write_number_output()else:
self.txt['text']="最初にソートモードを選択してください"
# ヒルソートを呼び出す
def shell(self):iflen(self.choose.get())>10:
start = datetime.datetime.now()
self.number = self.my.shell_sort(self.number)
end = datetime.datetime.now()
self.get_effiency_writefile(start, end, name="ヒルソート", text="shell")
self.write_number_output()else:
self.txt['text']="最初にソートモードを選択してください"
# バブルソートを呼び出す
def buddle(self):iflen(self.choose.get())>10:
start = datetime.datetime.now()
self.number = self.my.buddle_sort(self.number)
end = datetime.datetime.now()
self.get_effiency_writefile(start, end, name="バブルソート", text="buddle")
self.write_number_output()else:
self.txt['text']="最初にソートモードを選択してください"
# クイックソートを呼び出す
def quick(self):iflen(self.choose.get())>10:
start = datetime.datetime.now()
self.number = self.my.quick_sort(self.number,0,self.count-1)
end = datetime.datetime.now()
self.get_effiency_writefile(start, end, name="クイックソート", text="quick")
self.write_number_output()else:
self.txt['text']="最初にソートモードを選択してください"
# コール選択ソート
def select(self):iflen(self.choose.get())>10:
start = datetime.datetime.now()
self.number = self.my.select_sort(self.number)
end = datetime.datetime.now()
self.get_effiency_writefile(start, end, name="並べ替えを選択", text="select")
self.write_number_output()else:
self.txt['text']="最初にソートモードを選択してください"
# ヒープソートを呼び出す
def heap(self):iflen(self.choose.get())>10:
start = datetime.datetime.now()
self.number = self.my.heap_sort(self.number)
end = datetime.datetime.now()
self.get_effiency_writefile(start, end, name="並べ替えを選択", text="heap")
self.write_number_output()else:
self.txt['text']="最初にソートモードを選択してください"
# ソートされた番号を入力テキストボックスと出力テキストボックスに書き込みます
def write_number_output(self):
temp =""for i in self.number:
temp +=str(i)
temp +=" "
self.output_txt.delete(0.0,END)
self.output_txt.insert(0.0,temp)
# インターフェイスのソースコードを表示する
def view_gui(self):try:
f =open("Text_File\\gui.txt",'r+')
txt = f.read()
self.output_txt.delete(0.0,END)
self.output_txt.insert(0.0,txt)
except:
pass
# ソートソースコードを表示
def view_sort(self):try:
f =open("Text_File\\sort.txt",'r+')
txt = f.read()
self.output_txt.delete(0.0,END)
self.output_txt.insert(0.0,txt)
except:
pass
def get_effiency_writefile(self,start,end,name,text):
write = name +"開始時間:\n"
write +=str(start)
write +="\n"
write +="終了時間:\n"
write +=str(end)
write +="\n"
write +="時間コスト:"
write +=str(end-start)
write +="\n"
self.efficiency['text']= write
try:
f =open('Text_File\\%s_result.txt'%(text),'w')for i in self.number:
write +=str(i)
write +=" "
f.write(write)
f.close()
except:
pass
if __name__ =='__main__':
root =Tk()
root.title("データ構造-並べ替え")
root.geometry("400x400")
app =Application(root)
root.iconbitmap("hanhan.ico")
root.mainloop()
# - *- coding: utf-8-*-import math
import sys
classMy_Sort():
#1 挿入ソート
def insert_sort(self,lists):
count =len(lists)for i inrange(1,count):
key = lists[i]
j = i-1while j>=0:if lists[j]> key:
lists[j+1]= lists[j]
lists[j]= key
j-=1return lists
#2 ヒルソート,ループ内のステップサイズは整数であることにPythonで注意する必要があります
def shell_sort(self,lists):
count =int(len(lists))
step =2
group =int(count /step)while group >0:for i inrange(group):
j = i+group
while j< count:
k = j - group
key = lists[j]while(k>=0):if lists[k]>key:
lists[k+group]= lists[k]
lists[k]= key
k -= group
j += group
group =int(group/step)return lists
#3 バブルソート
def buddle_sort(self,lists):
count =len(lists)for i inrange(count):for j inrange(i+1,count):if lists[i]>lists[j]:
lists[i],lists[j]= lists[j],lists[i]return lists
#4 直接選択ソート
def select_sort(self,lists):
count =len(lists)for i inrange(count):
min = i
for j inrange(i+1,count):if lists[min]> lists[j]:
min = j
lists[min],lists[i]= lists[i],lists[min]return lists
#5 クイックソート
def quick_sort(self, lists, left, right):if left > right:return
i = left
j = right
while i != j:while lists[j]>= lists[left] and i < j:
j -=1while lists[i]<= lists[left] and i < j:
i +=1if i < j:
lists[i], lists[j]= lists[j], lists[i]
lists[left], lists[i]= lists[i], lists[left]
self.quick_sort(lists, left, i -1)
self.quick_sort(lists, i +1, right)return lists
#6 ヒープソート
# チューニングヒープ
def adjust_heap(self,lists,i,size):
lchild =2*i+1
rchild =2*i+2
max = i
if i <int(size/2):if lchild < size and lists[lchild]> lists[max]:
max = lchild
if rchild < size and lists[rchild]> lists[max]:
max = rchild
if max !=i:
lists[max],lists[i]= lists[i],lists[max]
self.adjust_heap(lists,max,size)
# ヒープを作成する
def build_heap(self,lists,size):for i inrange(0,int((size/2)))[::-1]:
self.adjust_heap(lists,i,size)
# ヒープソート
def heap_sort(self,lists):
size =int(len(lists))
self.build_heap(lists,size)for i inrange(0,size)[::-1]:
lists[0],lists[i]= lists[i], lists[0]
self.adjust_heap(lists,0,i)return lists
Recommended Posts