1. 程式人生 > >資料結構之內部排序--折半插入排序

資料結構之內部排序--折半插入排序

概要

-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]