標籤:第一個 sel 效果 思想 ret bsp 方法 複雜 線性
1 import cProfile 2 import random 3 class SortAlgorithm: 4 def __init__(self,unsortedlist=[]): 5 self.unsortedlist = unsortedlist or [i for i in random.sample(range(10000),100)] 6 self.length = len(self.unsortedlist) 7 8 def bubble_sort(self): 9 ‘‘‘10 冒泡排序:從第一個元素開始,每每相鄰的兩個元素進行比較,若前者比後者大則交換位置。最後兩個相鄰元素比較完成後,最大的元素形成,11 然後再次從頭開始進行比較,若元素個數為n個,則總共需要進行n-1輪比較就可完成排序。一般情況下演算法複雜度是平方級。12 ‘‘‘13 for i in range(self.length-1):14 for j in range(self.length-i-1):15 if self.unsortedlist[j]>self.unsortedlist[j+1]:16 self.unsortedlist[j],self.unsortedlist[j+1] = self.unsortedlist[j+1],self.unsortedlist[j]17 18 return self.unsortedlist19 20 def selection_sort(self):21 ‘‘‘22 選擇排序:從未排序的序列中找到一個最小的元素,放到第一位,再從剩餘未排序的序列中找到最小的元素,放到第二位,依此類推,直到所有元素都已排序完畢。23 假設序列元素總共n個,則我們需要找n-1輪,就可以使該序列排好序。時間複雜度是平方級。24 ‘‘‘25 for i in range(self.length-1):26 for j in range(i+1,self.length):27 if self.unsortedlist[i]>self.unsortedlist[j]:28 self.unsortedlist[i],self.unsortedlist[j] = self.unsortedlist[j],self.unsortedlist[i]29 return self.unsortedlist30 31 def insert_sort(self):32 ‘‘‘33 插入排序:把序列的第一個元素當成已排序列表中的元素,接著從第二個元素開始,與已排序列表中的元素一一比較,並放到合適的位置。假設有n個元素需要排序,則需要n-1輪插入就可排好序。34 時間複雜度為平方級。35 ‘‘‘36 for i in range(1,self.length):37 for j in range(i):38 if self.unsortedlist[i]<self.unsortedlist[j]:39 self.unsortedlist.insert(j,self.unsortedlist.pop(i))40 break41 return self.unsortedlist42 43 def merge_sort(self,lists=None,divid=None):44 ‘‘‘45 歸併排序:歸併排序是約翰·馮·諾伊曼發明,是一種典型的分治法(Divide and Conquer),把一個無序列表一分為二,對每個子序列再一分為二,繼續下去,直到無法再進行劃分為止。46 然後,就開始合并的過程,對每個子序列和另外一個子序列的元素進行比較,依次把小元素放入結果序列中進行合并,最終完成歸併排序。時間複雜度是線性對數級。47 ‘‘‘48 lists = lists or self.unsortedlist49 if len(lists)<=1:50 return lists51 divid = divid or len(lists)//252 left_list = self.merge_sort(lists=lists[:divid])53 right_list = self.merge_sort(lists=lists[divid:])54 55 result = []56 l,r=0,057 while len(left_list)>l and len(right_list)>r:58 if left_list[l]<right_list[r]:59 result.append(left_list[l])60 l+=161 else:62 result.append(right_list[r])63 r+=164 result+=left_list[l:]65 result+=right_list[r:]66 return result67 68 def quick_sort(self,lists=None):69 ‘‘‘70 快速排序:快速排序也是一種分治思想,基本思想是先隨便在無序列表中找一個元素,以這個元素為基準,其他所有元素都跟該元素比,比該元素小的成為一個子序列,比該元素大的成為另一個子序列,71 這樣其中一部分資料都比另一部分小,然後再按照此方法分別進行快速排序,最終達到排序效果。時間複雜度一般為線性對數級。72 ‘‘‘73 lists = lists or self.unsortedlist74 if len(lists)<=1:75 return lists76 small = []77 large = []78 divid = lists.pop(0)79 for each in lists:80 if each<divid:81 small.append(each)82 else:83 large.append(each)84 self.quick_sort(small)85 self.quick_sort(large)86 return self.quick_sort(small)+[divid]+self.quick_sort(large)87 88 89 if __name__==‘__main__‘:90 sort = SortAlgorithm()91 #result = sort.bubble_sort()92 #result = sort.selection_sort()93 #result = sort.insert_sort()94 #result = sort.merge_sort()95 result = sort.quick_sort()96 print(result)
Python之基本排序演算法的實現