真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Python八大常見排序算法定義、實(shí)現(xiàn)及時(shí)間消耗效率分析-創(chuàng)新互聯(lián)

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

創(chuàng)新互聯(lián)建站堅(jiān)信:善待客戶,將會(huì)成為終身客戶。我們能堅(jiān)持多年,是因?yàn)槲覀円恢笨芍档眯刨?。我們從不忽悠初訪客戶,我們用心做好本職工作,不忘初心,方得始終。10余年網(wǎng)站建設(shè)經(jīng)驗(yàn)創(chuàng)新互聯(lián)建站是成都老牌網(wǎng)站營(yíng)銷服務(wù)商,為您提供成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、網(wǎng)站設(shè)計(jì)、H5建站、網(wǎng)站制作、高端網(wǎng)站設(shè)計(jì)、小程序制作服務(wù),給眾多知名企業(yè)提供過(guò)好品質(zhì)的建站服務(wù)。

昨晚上開始總結(jié)了一下常見的幾種排序算法,由于之前我已經(jīng)寫了好幾篇排序的算法的相關(guān)博文了現(xiàn)在總結(jié)一下的話可以說(shuō)是很方便的,這里的目的是為了更加完整詳盡的總結(jié)一下這些排序算法,為了復(fù)習(xí)基礎(chǔ)的東西,從冒泡排序、直接插入排序、選擇排序、歸并排序、希爾排序、桶排序、堆排序??焖倥判蛉胧謥?lái)分析和實(shí)現(xiàn),在最后也給出來(lái)了簡(jiǎn)單的時(shí)間統(tǒng)計(jì),重在原理、算法基礎(chǔ),其他的次之,這些東西的熟練掌握不算是對(duì)之后的工作或者接下來(lái)的準(zhǔn)備面試都是很有幫助的,算法重在理解內(nèi)在含義和理論基礎(chǔ),在實(shí)現(xiàn)的時(shí)候才能避開陷阱少出錯(cuò)誤,這不是說(shuō)練習(xí)的時(shí)候有錯(cuò)誤不好而是說(shuō),有些不該出現(xiàn)的錯(cuò)誤盡量還是少出現(xiàn)的好,畢竟好的編程習(xí)慣是離不開嚴(yán)格的約束的,好了,這里就不多說(shuō)了,復(fù)習(xí)一下基礎(chǔ)知識(shí),共同學(xué)習(xí)吧,下面是具體實(shí)現(xiàn),注釋應(yīng)該都很詳細(xì),就不解釋了:

#!usr/bin/env python
#encoding:utf-8
'''''
__Author__:沂水寒城
功能:八大排序算法
'''
import time
import random
time_dict={}
def time_deco(sort_func):
  '''''
  時(shí)間計(jì)算的裝飾器函數(shù),可用于計(jì)算函數(shù)執(zhí)行時(shí)間
  '''
  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 '耗時(shí)為:',(end_time-start_time)*1000
    print '結(jié)果為:', res
  return wrapper
def random_nums_generator(max_value=1000, total_nums=20):
  '''''
  隨機(jī)數(shù)列表生成器
  一些常用函數(shù):
  random隨機(jī)數(shù)生成
  random.random()用于生成一個(gè)0到1之間的隨機(jī)數(shù):0 <= n < 1.0;
  random.uniform(a, b),用于生成一個(gè)指定范圍內(nèi)的隨機(jī)符點(diǎn)數(shù),兩個(gè)參數(shù)其中一個(gè)是上限,一個(gè)是下限。min(a,b) <= n <= max(a,b);
  randdom.randint(a, b), 用于生成一個(gè)指定范圍內(nèi)的整數(shù),其中a是下限,b是上限: a<= n <= b;
  random.randrange(start, stop, step), 從指定范圍內(nèi),按指定基數(shù)遞增的集合獲取一個(gè)隨機(jī)數(shù);
  random.choice(sequence), 從序列中獲取一個(gè)隨機(jī)元素;
  random.shuffle(x), 用于將一個(gè)列表中的元素打亂;
  random.sample(sequence, k), 從指定序列中隨機(jī)獲取指定長(zhǎng)度的片斷;
  '''
  num_list=[]
  for i in range(total_nums):
    num_list.append(random.randint(0,max_value))
  return num_list
#@time_deco
def Bubble_sort(num_list):
  '''''
  冒泡排序,時(shí)間復(fù)雜度O(n^2),空間復(fù)雜度O(1),是穩(wěn)定排序
  '''
  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_deco
def Insert_sort(num_list):
  '''''
  直接插入排序,時(shí)間復(fù)雜度O(n^2),空間復(fù)雜度O(1),是穩(wěn)定排序
  '''
  for i in range(len(num_list)):
    for j in range(0,i):
      if num_list[i]0:
    i=0
    while i=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 '---------本輪結(jié)果為:--------'
        #print new_list
        j=j+step
        #print j
      i=i+1
      #print i
    step=step/2   #希爾排序是一個(gè)更新步長(zhǎng)的算法
  return new_list
#@time_deco
def Tong_sort(num_list):
  '''''
  桶排序,時(shí)間復(fù)雜度O(1),空間復(fù)雜度與大數(shù)字有關(guān),可以認(rèn)為是O(n),典型的空間換時(shí)間的做法
  '''
  original_list = []
  total_num=max(num_list) #獲取桶的個(gè)數(shù)
  for i in range(total_num+1): #要注意這里需要的數(shù)組元素個(gè)數(shù)總數(shù)比total_num數(shù)多一個(gè)因?yàn)橄聵?biāo)從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_list
def Quick_sort(num_list):
  '''''
  快速排序,時(shí)間復(fù)雜度:O(nlog₂n),空間復(fù)雜度:O(nlog₂n),不是穩(wěn)定排序
  '''
  if len(num_list)<2:
    return num_list
  left_list = [] #存放比基準(zhǔn)結(jié)點(diǎn)小的元素
  right_list = [] #存放比基準(zhǔn)元素大的元素
  base_node = num_list.pop(0) #在這里采用pop()方法的原因就是需要移除這個(gè)基準(zhǔn)結(jié)點(diǎn),并且賦值給base_node這個(gè)變量
                #在這里不能使用del()方法,因?yàn)閯h除之后無(wú)法再賦值給其他變量使用,導(dǎo)致最終數(shù)據(jù)缺失
                #快排每輪可以確定一個(gè)元素的位置,之后遞歸地對(duì)兩邊的元素進(jìn)行排序
  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_childnum_list[max_temp]:
    max_temp = left_child
  if right_childnum_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) #避免調(diào)整之后以max為父節(jié)點(diǎn)的子樹不是堆
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_deco
def Heap_sort(num_list):
  '''''
  堆排序,時(shí)間復(fù)雜度:O(nlog₂n),空間復(fù)雜度:O(1),不是穩(wěn)定排序
  '''
  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_list
if __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


網(wǎng)站欄目:Python八大常見排序算法定義、實(shí)現(xiàn)及時(shí)間消耗效率分析-創(chuàng)新互聯(lián)
網(wǎng)站地址:http://weahome.cn/article/djgged.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部