**講解可以參考別人的一篇文章:十大排序演算法(該文全長 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...