国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python八大常見排序算法定義、實現及時間消耗效率分析

2020-02-22 23:54:15
字體:
來源:轉載
供稿:網友

本文實例講述了Python八大常見排序算法定義、實現及時間消耗效率分析。分享給大家供大家參考,具體如下:

昨晚上開始總結了一下常見的幾種排序算法,由于之前我已經寫了好幾篇排序的算法的相關博文了現在總結一下的話可以說是很方便的,這里的目的是為了更加完整詳盡的總結一下這些排序算法,為了復習基礎的東西,從冒泡排序、直接插入排序、選擇排序、歸并排序、希爾排序、桶排序、堆排序??焖倥判蛉胧謥矸治龊蛯崿F,在最后也給出來了簡單的時間統計,重在原理、算法基礎,其他的次之,這些東西的熟練掌握不算是對之后的工作或者接下來的準備面試都是很有幫助的,算法重在理解內在含義和理論基礎,在實現的時候才能避開陷阱少出錯誤,這不是說練習的時候有錯誤不好而是說,有些不該出現的錯誤盡量還是少出現的好,畢竟好的編程習慣是離不開嚴格的約束的,好了,這里就不多說了,復習一下基礎知識,共同學習吧,下面是具體實現,注釋應該都很詳細,就不解釋了:

#!usr/bin/env python#encoding:utf-8'''''__Author__:沂水寒城功能:八大排序算法'''import timeimport randomtime_dict={}def time_deco(sort_func):  '''''  時間計算的裝飾器函數,可用于計算函數執行時間  '''  def wrapper(num_list):    start_time=time.time()    res=sort_func(num_list)    end_time=time.time()    time_dict[str(sort_func)]=(end_time-start_time)*1000    print '耗時為:',(end_time-start_time)*1000    print '結果為:', res  return wrapperdef random_nums_generator(max_value=1000, total_nums=20):  '''''  隨機數列表生成器  一些常用函數:  random隨機數生成  random.random()用于生成一個0到1之間的隨機數:0 <= n < 1.0;  random.uniform(a, b),用于生成一個指定范圍內的隨機符點數,兩個參數其中一個是上限,一個是下限。min(a,b) <= n <= max(a,b);  randdom.randint(a, b), 用于生成一個指定范圍內的整數,其中a是下限,b是上限: a<= n <= b;  random.randrange(start, stop, step), 從指定范圍內,按指定基數遞增的集合獲取一個隨機數;  random.choice(sequence), 從序列中獲取一個隨機元素;  random.shuffle(x), 用于將一個列表中的元素打亂;  random.sample(sequence, k), 從指定序列中隨機獲取指定長度的片斷;  '''  num_list=[]  for i in range(total_nums):    num_list.append(random.randint(0,max_value))  return num_list#@time_decodef Bubble_sort(num_list):  '''''  冒泡排序,時間復雜度O(n^2),空間復雜度O(1),是穩定排序  '''  for i in range(len(num_list)):    for j in range(i,len(num_list)):      if num_list[i]>num_list[j]: #這里是升序排序        num_list[i], num_list[j]=num_list[j], num_list[i]  return num_list#@time_decodef Insert_sort(num_list):  '''''  直接插入排序,時間復雜度O(n^2),空間復雜度O(1),是穩定排序  '''  for i in range(len(num_list)):    for j in range(0,i):      if num_list[i]<num_list[j]: #這里是升序排序,跟冒泡排序差別在于,冒泡是向后遍歷,這個是向前遍歷        num_list[i], num_list[j]=num_list[j], num_list[i]  return num_list#@time_decodef Select_sort(num_list):  '''''  選擇排序,時間復雜度O(n^2),空間復雜度O(1),不是穩定排序  '''  for i in range(len(num_list)):    min_value_index=i    for j in range(i, len(num_list)):      if num_list[j]<num_list[min_value_index]:        min_value_index=j #乍一看,感覺冒泡,選擇,插入都很像,選擇跟冒泡的區別在于:冒泡是發現大                 #小數目順序不對就交換,而選擇排序是一輪遍歷結束后選出最小值才交換,效率更高    num_list[i], num_list[min_value_index]=num_list[min_value_index], num_list[i]  return num_list#@time_decodef Merge_sort(num_list):  '''''  歸并排序,時間復雜度O(nlog₂n),空間復雜度:O(1),是穩定排序  '''  if len(num_list)==1:    return num_list  length=len(num_list)/2  list1=num_list[:length]  list2=num_list[length:]  result_list=[]  while len(list1) and len(list2):    if list1[0]<=list2[0]:      result_list.append(list1[0])      del list1[0] #這里需要刪除列表中已經被加入到加過列表中的元素,否則最后比較完后列表    else:       #中剩余元素無法添加      result_list.append(list2[0])      del list1[0]  if len(list1): #遍歷比較完畢后列表中剩余元素的添加    result_list+=list1  else:    result_list+=list2  return result_list#@time_decodef Shell_sort(num_list):  '''''  希爾排序,時間復雜度:O(n),空間復雜度:O(n^2),不是穩定排序算法  '''  new_list = []  for one_num in num_list:    new_list.append(one_num)  count=len(new_list)  step=count/2;  while step>0:    i=0    while i<count:      j=i+step      while j<count:        t=new_list.pop(j)        k=j-step        while k>=0:          if t>=new_list[k]:            new_list.insert(k+1, t)            break          k=k-step        if k<0:          new_list.insert(0, t)        #print '---------本輪結果為:--------'        #print new_list        j=j+step        #print j      i=i+1      #print i    step=step/2   #希爾排序是一個更新步長的算法  return new_list#@time_decodef Tong_sort(num_list):  '''''  桶排序,時間復雜度O(1),空間復雜度與最大數字有關,可以認為是O(n),典型的空間換時間的做法  '''  original_list = []  total_num=max(num_list) #獲取桶的個數  for i in range(total_num+1): #要注意這里需要的數組元素個數總數比total_num數多一個因為下標從0開始    original_list.append(0)  for num in num_list:    original_list[num] += 1  result_list = []  for j in range(len(original_list)):    if original_list[j] != 0:      for h in range(0,original_list[j]):        result_list.append(j)  return result_listdef Quick_sort(num_list):  '''''  快速排序,時間復雜度:O(nlog₂n),空間復雜度:O(nlog₂n),不是穩定排序  '''  if len(num_list)<2:    return num_list  left_list = [] #存放比基準結點小的元素  right_list = [] #存放比基準元素大的元素  base_node = num_list.pop(0) #在這里采用pop()方法的原因就是需要移除這個基準結點,并且賦值給base_node這個變量                #在這里不能使用del()方法,因為刪除之后無法再賦值給其他變量使用,導致最終數據缺失                #快排每輪可以確定一個元素的位置,之后遞歸地對兩邊的元素進行排序  for one_num in num_list:    if one_num < base_node:      left_list.append(one_num)    else:      right_list.append(one_num)  return Quick_sort(left_list) + [base_node] + Quick_sort(right_list)def Heap_adjust(num_list, i, size):  left_child = 2*i+1  right_child = 2*i+2  max_temp = i  #print left_child, right_child, max_temp  if left_child<size and num_list[left_child]>num_list[max_temp]:    max_temp = left_child  if right_child<size and num_list[right_child]>num_list[max_temp]:    max_temp = right_child  if max_temp != i:    num_list[i], num_list[max_temp] = num_list[max_temp], num_list[i]    Heap_adjust(num_list, max_temp, size) #避免調整之后以max為父節點的子樹不是堆def Create_heap(num_list, size):  a = size/2-1  for i in range(a, -1, -1):    #print '**********', i    Heap_adjust(num_list, i, size)#@time_decodef Heap_sort(num_list):  '''''  堆排序,時間復雜度:O(nlog₂n),空間復雜度:O(1),不是穩定排序  '''  size=len(num_list)  Create_heap(num_list, size)  i = size-1  while i > 0:    num_list[0], num_list[i] = num_list[i], num_list[0]    size -= 1    i -= 1    Heap_adjust(num_list, 0, size)  return num_listif __name__ == '__main__':  num_list=random_nums_generator(max_value=100, total_nums=50)  print 'Bubble_sort', Bubble_sort(num_list)  print 'Insert_sort', Insert_sort(num_list)  print 'Select_sort', Select_sort(num_list)  print 'Merge_sort', Merge_sort(num_list)  print 'Shell_sort', Shell_sort(num_list)  print 'Tong_sort', Tong_sort(num_list)  print 'Heap_sort', Heap_sort(num_list)  print 'Quick_sort', Quick_sort(num_list)  # print '-----------------------------------------------------------------------------'  # for k,v in time_dict.items():  #   print k, v            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阿勒泰市| 镇巴县| 陆丰市| 疏附县| 通海县| 潜江市| 长岛县| 德钦县| 深水埗区| 临夏市| 保靖县| 铜梁县| 芷江| 宣化县| 博客| 无为县| 二连浩特市| 临汾市| 堆龙德庆县| 司法| 舞钢市| 高阳县| 原阳县| 广南县| 鸡东县| 宾川县| 永和县| 临汾市| 大石桥市| 南丹县| 福贡县| 龙门县| 雷波县| 永康市| 乌拉特前旗| 栖霞市| 汝南县| 崇左市| 滨州市| 栖霞市| 汝南县|