日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

选择排序及其优化

發布時間:2025/10/17 编程问答 10 豆豆
生活随笔 收集整理的這篇文章主要介紹了 选择排序及其优化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

選擇排序

復雜度: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__ ,三個里面實現兩個即可,剩余操作符的定義取余即可;當僅實現一個時,無法補全剩余運算符(但也合法)

  • 重載時的改進:兩個對象的大小關系不僅取決于年齡,還取決于姓名首字母
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.name < other.name if self.age == other.age else 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]print([(i.age,i.name) for i in myarr])if __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=1))

結果符合預期,注意,必須在函數內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')

總結

以上是生活随笔為你收集整理的选择排序及其优化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。