資料結構 排序演算法

2021-10-03 18:18:10 字數 3921 閱讀 2154

#直接插入排序

definsert

(nums)

:for i in

range(1

,len

(nums)):

for j in

range

(i-1,-

1,-1

):if nums[j+1]

: temp = nums[j]

nums[j]

= nums[j+1]

nums[j+1]

= temp

else

:break

return nums

# 氣泡排序

defbubble_sort

(nums)

:for i in

range(1

,len

(nums)):

for j in

range(0

,len

(nums)

- i)

:if nums[j+1]

: temp = nums[j]

nums[j]

= nums[j+1]

nums[j+1]

= temp

return nums

# 選擇排序

defselect_******

(nums)

:for i in

range(0

,len

(nums)):

nummin = nums[i]

for j in

range

(i+1

,len

(nums)):

if nums[j]

< nummin:

temp = nums[j]

nums[j]

= nummin

nummin = temp

nums[i]

= nummin

return nums

# 希爾排序

defshell_sort

(items)

: n =

len(items)

step = n //

2#step = 5

while step >0:

for cur in

range

(step, n)

: i = cur

print

(i,step,items[i-step]

,items[i]

)while i >= step and items[i-step]

> items[i]

:print

('進入while'

) items[i - step]

, items[i]

= items[i]

, items[i-step]

print

('i:'

,i,'step:'

,step)

i -= step ### ?????????????

print

(items)

step = step //

2return items

#歸併排序

defmerge

(arr, l, m, r)

: n1 = m - l +

1 n2 = r- m

# 建立臨時陣列

l =[0

]*(n1)

r =[0

]*(n2)

# 拷貝資料到臨時陣列 arrays l 和 r

for i in

range(0

, n1)

: l[i]

= arr[l + i]

for j in

range(0

, n2)

: r[j]

= arr[m +

1+ j]

# 歸併臨時陣列到 arr[l..r]

i =0# 初始化第乙個子陣列的索引

j =0# 初始化第二個子陣列的索引

k = l # 初始歸併子陣列的索引

while i < n1 and j < n2 :

if l[i]

<= r[j]

: arr[k]

= l[i]

i +=

1else

: arr[k]

= r[j]

j +=

1 k +=

1# 拷貝 l 的保留元素

while i < n1:

arr[k]

= l[i]

i +=

1 k +=

1# 拷貝 r 的保留元素

while j < n2:

arr[k]

= r[j]

j +=

1 k +=

1def

mergesort

(arr,l,r)

:if l < r:

m =int(

(l+(r-1)

)/2)

mergesort(arr, l, m)

mergesort(arr, m+

1, r)

merge(arr, l, m, r)

arr =[1

,5,8

,7,6

,4,5

,8,9

,11]n =

len(arr)

print

("給定的陣列"

)for i in

range

(n):

print

("%d"

%arr[i]),

mergesort(arr,

0,n-1)

print

("\n\n排序後的陣列"

)for i in

range

(n):

print

("%d"

%arr[i]

)# 快速排序

defquick_sort

(a,start,end)

:if start < end:

low , high , pivotkey = start , end , a[start]

while

(low

(a[high]

< pivotkey)

:break

high -=

1#將找到的值放入a[low]

if(low < high)

: a[low]

= a[high]

low +=

1#從左往右找到第乙個大於pivotkey的值

while

(low

(a[low]

> pivotkey)

:break

low +=

1#將這個值賦給上乙個留下的坑a[high]

if(low

: a[high]

= a[low]

high -=

1 a[low]

= pivotkey

quick_sort(a , start ,low-1)

quick_sort(a , low+

1, end)

return a

資料結構 排序演算法

include include define maxitem 100 typedef char keytype 5 typedef int elemtype typedef struct rec elemnode maxitem 氣泡排序演算法 void bubblesort elemnode r,...

資料結構 排序演算法

排序演算法分為內部排序和外部排序兩大類。內部排序 在計算機記憶體中完成的排序演算法 外部排序 不能再記憶體中文完成,必須在磁碟或者磁帶上完成的排序演算法 內部排序是研究的重點問題,通常我們講的八大排序演算法也主要是講的內部排序演算法。排序演算法的穩定性和時間空間複雜度 本文重點介紹以下幾種排序演算法...

資料結構 排序演算法

直接插入排序是指將r i r n 插入到已經有序的r 1 r i 1 序列中。r 0 是乙個哨兵,起到作為邊界條件並作為暫存單元的作用。實際上,一切為簡化邊界條件而引入的附加節點 元素 均可稱為哨兵。例如單鏈表中的頭結點。對於有n個記錄的集合,要進行n 1趟排序。其最優時間複雜度是o n 平均時間複...