排序演算法 插入,希爾和歸併

2021-09-24 10:12:51 字數 2611 閱讀 7542

如有錯誤,請指出,多謝。

**來自菜鳥教程,多謝。

一:插入排序

插入排序的基本思想是:每步將乙個待排序的記錄,按其關鍵碼值的大小插入前面已經排序的檔案中適當位置上,直到全部插入完為止

import random

def insertsort(arr):

for i in range(1,len(arr)):

#獲取前乙個下標和當前數字

index = i - 1

num = arr[i]

#當滿足條件時,執行此while語句

while index >= 0 and arr[index] > num:

#如果前乙個數大於當前數,交換

arr[index+1] = arr[index]

#把下標減1,繼續判斷,如果滿足,繼續執行while迴圈

index -= 1

arr[index+1] = num

print("排序後:",arr)

if __name__ == '__main__':

arr =

x = random.randint(2,20)

for i in range(0,x):

print("排序前:",arr)

insertsort(arr)

二:希爾排序 

它實際上是插入排序的高階,分組插入排序

import math

import random

def shellsort(arr):

#立個flag

flag = 1

#用於獲取flag數

while(flag < len(arr)/3):

#1*3+1,4*3+1,7*3+1

flag = flag*3+1

while flag > 0:

#插入排序

for i in range(flag,len(arr)):

index = i - flag

num = arr[i]

while index >= 0 and arr[index] > num:

arr[index+flag] = arr[index]

index -= flag

arr[index+flag] = num

flag = math.floor(flag/3)

print("排序後:",arr)

if __name__ == '__main__':

arr =

x = random.randint(2,20)

for i in range(0,x):

print("排序前:",arr)

shellsort(arr)

三:歸併排序

歸併操作的工作原理如下:

第一步:申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列

第二步:設定兩個指標,最初位置分別為兩個已經排序序列的起始位置

重複步驟3直到某一指標超出序列尾

將另一串行剩下的所有元素直接複製到合併序列尾

import random

def mergesort(arr):

#遞迴出口

if len(arr) < 2:

return arr

#將傳入的陣列分為兩部分,放入新的陣列

middle = int(len(arr)/2)

left_arr = arr[0:middle]

right_arr = arr[middle:]

#遞迴呼叫

return merge(mergesort(left_arr),mergesort(right_arr))

def merge(left_arr,right_arr):

# print(left_arr,right_arr)

result =

#當兩個陣列均不空時,將小的放入新陣列

while left_arr and right_arr:

if left_arr[0] < right_arr[0]:

else:

#當其中乙個陣列空時

while right_arr:

while left_arr:

# print(result)

return result

if __name__ == '__main__':

arr =

x = random.randint(2,20)

for i in range(0,x):

print("排序前:",arr)

print("排序後:",mergesort(arr))

插入 希爾 歸併排序演算法, python編寫

其排序時間複雜度為 nums 54,26,93,17,77,31,44,55,20 for i in range 1,len nums currentvalue nums i position i while position 0 and currentvalue在最壞的情況下,插入排序演算法的比較...

插入排序,希爾排序,歸併排序

public class mainclass shellsort1 arr foreach var item in arr console.readkey static void shellsort1 int arr arr j step temp step step 2 static void i...

選擇 冒泡 歸併 插入及希爾排序

選擇排序每次遍歷一遍陣列,找出最小的數,然後跟陣列的第乙個元素交換。再從剩下的元素中重複此步驟直至陣列排序完畢。時間複雜度與輸入資料無關,為o n 2 每次從首元素開始,從左到右交換相鄰且逆序的元素,一直交換到尾元素時即完成一輪迴圈,此時末尾元素即為最大值。接著在除尾元素外的剩餘元素中繼續上述迴圈,...