演算法和資料結構的應用( 排序演算法的實現 )

2021-08-19 20:35:00 字數 2375 閱讀 5098

'''排序演算法的實現'''

import random

def bubble_sort(l):

'''氣泡排序的實現

o(n**2)

穩定演算法

'''for i in range(len(l)):

for j in range(len(l) - i - 1):

if l[j] > l[j + 1]:

l[j], l[j + 1] = l[j + 1], l[j]

return l

def insert_sort(l):

'''插入排序

o(n**2)

穩定'''

count = len(l)

for i in range(1, count):

key = l[i]

j = i - 1

while j >= 0:

if l[j] > key:

l[j + 1] = l[j]

l[j] = key

else:

break

j -= 1

return l

def quick_sort(l):

'''快速排序

o(nlogn)

不穩定'''

if len(l) < 2:

return l

key = l[0]

lt = [x for x in l[1:] if x <= key]

gt = [x for x in l[1:] if x > key]

return quick_sort(lt) + [key] + quick_sort(gt)

def choice_sort(l):

'''選擇排序

o(n**2)

不穩定'''

count = len(l)

for i in range(count):

min = i

for j in range(i + 1, count):

if l[j] < l[min]:

min = j

l[i], l[min] = l[min], l[i]

return l

def shell_sort(l):

"""希爾排序

o(n**2)

不穩定"""

n = len(l)

gap = n // 2

while gap > 0:

for i in range(gap, n):

while i > 0:

if l[i - gap] > l[i]:

l[i], l[i - gap] = l[i - gap], l[i]

i -= gap

else:

break

gap //= 2

return l

def merge_sort(l):

'''歸併排序

o(nlongn)

穩定 '''

# 以下是歸併過程中分解的過程

n = len(l) // 2

if n <= 1:

return l

left = merge_sort(l[:n])

right = merge_sort(l[n:])

# 以下是歸併演算法中的合併的過程

result =

i, j = 0, 0

while i < len(left) and j < len(right):

if left[i] < right[j]:

i += 1

else:

j += 1

# 迴圈退出,將left和right中剩下的元素放入到列表中

result += left[i:]

result += right[j:]

return result

if __name__ == '__main__':

l = [x for x in map(lambda x:random.randrange(50), range(10))]

print('原始列表: ', l)

bubble_sort(l)

print('氣泡排序: ', l)

insert_sort(l)

print('插入排序: ', l)

print('快速排序: ', quick_sort(l))

choice_sort(l)

print('選擇排序: ', l)

shell_sort(l)

print('希爾排序: ', l)

print('歸併排序: ', merge_sort(l))

演算法和資料結構 排序 快速排序

交換位置 交換順序表l中子表的記錄,使樞軸記錄到位,並返回其所在位置 此時在它之前 後 的記錄均不大 小 於它。int partition sqlist l,int low,int high return low 返回樞軸所在位置 對順序表l中的子串行l r low.high 作快速排序 void ...

c 演算法和資料結構 快速排序演算法

問題描述 快速排序演算法 描述 快速排序演算法 類名 quicksort public class quicksort while a i pivot i right 從左向右尋找大於支點元素 do while a j pivot j 0 從右向左尋找小於支點元素 if i j break else...

資料結構與演算法 演算法 演算法和資料結構

資料結構與演算法 演算法 好吧,在這裡,您被優秀或優秀的軟體開發人員所隔開。在這種情況下,我會告訴您一開始或至少在我的情況下,並且我知道大多數時候,對於我認識的大多數人,您會覺得自己是乙個無能的人或白痴。基本上,我怎麼可能不理解這一點,然後您會感到沮喪。在這種情況下,我會告訴您情況並不像您想的那麼糟...