选择排序及其优化
選擇排序
復雜度:O(n**2)
一、思路
index 0 1 2 3 4 ... n-1 n value 3 1 2 5 4 ... 8- 思考過程:
1、在整個數組[0,n)內尋找最小值1,將其與list[0]交換位置:1 3 2 5 4 8,此時index=0的位置已排序完成
2、在[1,n)內尋找最小值,將最小值與list[1]交換位置,此時index=1的位置排序完成
3、迭代下去,直到[i,n]長度為1,原地不動即可
二、實現
from random import randint from timeit import Timer from timeit import timeitdef selectionsort1(myarr):for i in range(len(myarr)):#求子數組[i,n)中的最小值對應的indexmin_index = ifor j in range(i,len(myarr)):if myarr[j] < myarr[min_index]:min_index = j#交換list[i]與list[min_index]myarr[i], myarr[min_index] = myarr[min_index],myarr[i]return myarrif __name__ == "__main__":array = [randint(0, 1000) for i in range(0,1000)]timer = Timer('selectionsort1(array)','from __main__ import selectionsort1,array')print(timer.timeit(number=10))- 借助魔法函數,實現運算符重載,類似于c++模板
可以比較任意對象,只要實現了魔法函數
from random import randint,choice from timeit import Timer from timeit import timeitclass Student():def __init__(self,name,age):self.name = nameself.age = agedef __lt__(self,other):return self.age < other.agedef __eq__(self,other):return self.age == other.agedef selectionsort1(myarr):for i in range(len(myarr)):#求子數組[i,n)中的最小值對應的indexmin_index = ifor j in range(i,len(myarr)):if myarr[j] < myarr[min_index]:min_index = j#交換list[i]與list[min_index]myarr[i], myarr[min_index] = myarr[min_index],myarr[i]return myarrif __name__ == "__main__":name_bank = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'array = [Student(choice(name_bank),randint(1,100)) for _ in range(1000)]timer = Timer('selectionsort1(array)','from __main__ import selectionsort1,array')print(timer.timeit(number=10))__lt__ __gt__ __eq__ ,三個里面實現兩個即可,剩余操作符的定義取余即可;當僅實現一個時,無法補全剩余運算符(但也合法)
- 重載時的改進:兩個對象的大小關系不僅取決于年齡,還取決于姓名首字母
結果符合預期,注意,必須在函數內print,因為timeit處于不同命名空間
三、排序算法練習常用輔助函數
from random import randint from time import timedef random_array(n, left, rught):return [randint(left,right) for _ in rnage(n)]def is_sorted(array):sorted = Truefor i in range(len(array)-1):if array[i] > array[i+1]:sorted = Falsebreakreturn sorteddef test_sort(sort_name, sort,array):start = time()sort(array)spend = time() - start#不正確時會拋出異常assert(is_sorted(array))print(sort_name + ' : '+ str(spend) + ' seconds')總結