資料結構之內部排序--折半插入排序
阿新 • • 發佈:2018-11-13
概要
-IDE:Pycharm
-Python版本:python3.x
-演算法分類:內部排序->插入類排序->折半插入排序
演算法思想
對於有序表進行折半查詢,其效能優於順序查詢。所以,可以將折半查詢的思想用於在
有序記錄$r[1,2,3,...,i-1]$中確定插入位置,相應的排序演算法稱為折半插入排序。
例如:序列$r$長度為$n$,前i項有序,待排的記錄為$r[i+1]$。此時低位為$r[1]$,高位為$r[i-1]$,
查詢$r[j]$,$ j=(i+1)/2$。 若$r[j]>r[i+1]$,此時證明那個,待排記錄,在$1-j$之間的位置。高位變為$r[j-1]$,若小於則相反,以此類推,找到合適的位置。
最後則是將記錄向後移一位。將待插入的值放入合適的位置。
演算法分析
採用折半插入排序,可以減少關鍵字的比較次數。每插入一次元素,需要比較的次數最大是折半判定樹的深度。如插入第$i$個元素時設$i=2^j$,則需要進行$log2^i$次比較,因此插入$n-1$個元素平均關鍵字比較次數$nlog2^n$。折半插入改變了元素的比較次數,但是沒有改變元素的移動耗費時間。所以其時間複雜度仍為$O(n^2)$。
穩定性與時間複雜度
排序演算法 | 穩定性 | 時間複雜度 | 最好情況 | 最壞情況 | 空間複雜度 |
---|---|---|---|---|---|
折半插入 | 穩定 | $O(n^2)$ | $O(nlogn)$ | $O(n^2)$ | $O(1)$ |
Python程式碼清單
# !/usr/bin/python3 # _*_ coding:utf-8 _*_ # 折半插入排序 import sys # 匯入sys,使用argv接收外部引數。 import time # 匯入time 用time() 進行記時。 import random # 匯入隨機數包生存隨機數 def BIS(number,maxNumber): # 演算法,number是傳入生成的個數,maxNumber代表生成的最大數 # 生成隨機數 timeStart = time.time() listA = [0] # 設定第一個值,防止 out of index ,設定變數 for i in range(number): listA.append(random.randint(0, maxNumber)) # 新增生成的值。 timeEnd = time.time() timeIs = timeEnd-timeStart print('生成%d個數的時間是%f' % (number, timeIs)) # print(listA) #################################################### # 進行排序 timeStart = time.time() for aim in range(2, number+1): # 選定範圍 low = 1 # 設定低位 high = aim-1 # 設定高位為物件減1 listA[0] = listA[aim] # 設定物件 while(low <= high): # 判斷高位與低位是否相交,若相交則說明找到位置。 mid = int((low+high)/2) # 折半取中間值 if((listA[mid]) > listA[0]): # 判斷取右方值還是左方值。 high = mid - 1 # 取左方 高位為mid-1 else: low = mid + 1 # 取右方 低位為mid +1 for count in range(0, aim-low): # aim-low 是迴圈的次數 listA[aim] = listA[aim-1] # 這裡是從後向前移 aim = aim - 1 # 向前加一 listA[low] = listA[0] # 最後替換值 timeEnd = time.time() timeIs = timeEnd-timeStart print('排序%d個數的時間是%f' % (number, timeIs)) # print(listA) if __name__ == '__main__': helpInfo = ''' This program is for Binary Insertion Sort. How to use it! Follow the example! python Binary_Insertion_Sort.py 10 100 The 10 representative will generate ten numbers. 100 representative the max-number you make. ''' command = sys.argv[0:] # 從鍵盤獲取輸入資訊。 lenght = len(command) # 計算資訊長度 if lenght != 3 or 'help' in command: # 第一判斷,對長度是否合法與是否有幫助文字進行判斷。 print(helpInfo) else: try: number = int(command[1]) # 第二次判斷,對輸入資料進行int轉化,即判斷是否為int maxNumber = int(command[2]) except ValueError: print(helpInfo) sys.exit(1) # 若不是int,則退出程式 BIS(number, maxNumber) # 呼叫方法,生成序列並排序。
有什麼問題請聯絡我
QQ:3116316431 (請附上資訊)
E-mail:[email protected]