資料結構排序

2021-09-24 14:29:31 字數 3280 閱讀 3094

**講解可以參考別人的一篇文章:十大排序演算法(該文全長 14237 字,配有 70 張和動畫,預計閱讀時間 47 分鐘,強烈建議通過電腦端進行閱讀。)

包括:氣泡排序

選擇排序

插入排序

希爾排序

歸併排序

快速排序

堆排序計數排序

桶排序基數排序

思路是定義乙個游標從一側到另一側,比較游標所指的位置,與下乙個要指的位置比較大小,如果大小不一致,則兩個數值互換,然後游標再向前推一位,依次這樣比較,直到第一輪迴圈比出最大或最小值,然後開始下一輪迴圈,已經比出來的值不用參與下輪迴圈。

import random

def bubble_sort(alist):

for i in range(len(alist) - 1):

# j表示每次遍歷需要比較的次數,j隨迴圈次數增加而減小

for j in range(i + 1, len(alist)):

if alist[i] > alist[j]:

alist[i], alist[j] = alist[j], alist[i]

alist = [281, 981, 738, 355, 226, 911, 532, 77, 175, 723]

bubble_sort(alist)

print(alist)

選出第某個位置的值,排出了前n-1個後,第n個一定是最大或最小值了,時間複雜度和冒泡一模一樣,都是o(n2)。

def selection_sort(alist):

#需要進行n-1次選擇操作

for i in range(len(alist)-1):

#i是列表的索引,預設alist[i]最小,往後找看有沒有比他小的,然後替換

min_index = i

for j in range(i+1,len(alist)):

if alist[min_index]>alist[j]:

min_index = j

#如果迴圈完成後,指標的位置發生了變化,交換原指標和新指標位置的值

if min_index != i:

alist[i],alist[min_index]=alist[min_index],alist[i]

alist = [281, 981, 738, 355, 226, 911, 532, 77, 175, 723]

selection_sort(alist)

print(alist)

插入排序原理從無序序列放入已構建好的有序序列中。依次進行掃瞄,找到相應的位置並插入,填坑

這個有序序列一開始是沒有值的,是從原無序序列中拿過來的值,所以,拿過來n個,有序序列就有n個,下一次拿過來的數要比較的次數就是n次,插入之後變成n+1個長度,依次類推,直至最後有序列表的長度等於原無序列表的長度

而在我們的排序中,有序序列和無序序列都在同乙個序列中,前半部分有序,後半部分無序,所以因為序列的連續性,只能從無序部分的第乙個先放進有序序列的最後乙個,然後依次向前比較,找到正確的位置,將該數插入。

def insert_sort(alist):

for i in range(1, len(alist)): # 第乙個坑是0索引位

for j in range(i, 0, -1):

if alist[j - 1] > alist[j]:

alist[j], alist[j - 1] = alist[j - 1], alist[j]

return alist

alist = [281, 981, 738, 355, 226, 911, 532, 77, 175, 723]

result = insert_sort(alist)

print(result)

快速排序是在乙個序列中選出乙個基準值(第乙個,最後乙個或者中間乙個),將這個值取出來,然後讓序列中的其他值與之比較,比它大的放在左邊,比較小的放在右邊,第一輪迴圈結束後序列結構是小值序列+基準值+大值序列,然後將兩邊的序列也照此操作。快速排序要用到遞迴

方法一:

def quick_sort(alist, start, end):

if start >= end:

return

mid = alist[start]

left = start

right = end

while left < right: # 左右指標是否交匯

# 右邊的向左移

while left < right and alist[right] >= mid:

right -= 1

alist[left] = alist[right]

# 左邊的右移

while left < right and alist[left] < mid:

left += 1

alist[right] = alist[left]

# 從迴圈退出時,left=right

alist[left] = mid

# 左邊的排序

quick_sort(alist, start, left - 1)

# 右邊的排序

quick_sort(alist, left + 1, end)

alis = [96, 33, 98, 34, 36, 82, 52, 5, 67, 79]

quick_sort(alis, 0, len(alis) - 1)

print(alis)

方法二:

def quick_sort(data):

if len(data)>1:

left =

right =

base_index = len(data)//2 #基準值索引

base_data = data[base_index] #基準值

data.remove(base_data)

for li in data:

if li>=base_data:

else:

return quick_sort(left) + [base_data] + quick_sort(right)

else:

return data

alist = [281, 981, 738, 355, 226, 911, 532, 77, 175, 723]

result = quick_sort(alist)

print(result)

資料結構 排序

小小總結了下 希望別不記得 排序型別 排序方法 平均時間 最壞時間 最好時間 穩定空間 插入直接插入 o n2 o n2 o n 穩定o 1 希爾排序 o n3 2 增量序列最後為1,只有公因子1 不穩o 1 選擇簡單選擇 o n2 o n2 o n 穩定o 1 堆排序o n lb n o n lb...

資料結構 排序

郝斌版 資料結構 學習筆記 冒泡 公升序,12比,大放後面,再23比,直至最大的在最後面 插入 2,3,4,依次插入值,保證插入值後的序列為有序的 選擇 後面所有的最小值依次排到最前 快速排序 歸併排序 22排,44排,88排.排序演算法標準 時間,空間,穩定性 排序和查詢的關係 排序是查詢的前提,...

資料結構 排序

1.希爾排序 shellsort 增量序列d n為要排序數的個數 void shellinsertsort int a,int n,int dk n個要排序的數,dk是增量 2 堆排序 已知h s m 除了h s 外均滿足堆的定義 調整h s 使其成為大頂堆.即將對第s個結點為根的子樹篩選,para...