"""
author = xcy
**參考別人,盡量自己寫了 =。=
命名規則不太好,不建議用list命名,但不好改了。
寫的過程中遇到的問題都寫在注釋中
以下方法都在pycharm中除錯過,python3.7,但測試用例不多,難免有錯誤望批評指正
剛發現shell排序**有問題,網上的部落格都是照搬的啊,錯的也搬。。還有歸併和堆排序,有機會填坑
"""import random
import time
random.seed(10)
l = [random.randint(1, 101) for _ in range(20)]
print(l)
# 冒牌排序,這個是把最大值冒泡到最後,注意和select的區別
def bubble(list):
l = len(list)
for i in range(l):
for j in range(0, l - i - 1):
if list[j] > list[j + 1]:
list[j], list[j + 1] = list[j + 1], list[j]
return list
# 選擇排序,本來把選擇排序寫成了把最小值通過和冒泡一樣的方法放到最前面,但選擇不是反向冒泡。。
# 這裡和冒泡的區別可以理解為交換的次數更少,因為是將當前的數和list[min]比較(list[min]是已經遍歷過的最小值
# 所以之後發生交換的可能性更小,但冒泡是選大的往後排,交換的可能性更大
def select(list):
l = len(list)
for i in range(l):
for j in range(i, l):
if list[i] > list[j]:
# !依然是通過交換保證資料資料不丟失,剛開始寫的時候各種操作導致資料資料丟了,結果也就不對了,
# 如果不是交換資料一般別動原陣列,交換是只交換數值,交換完min的值仍然為當前的下標
list[i], list[j] = list[j], list[i]
return list
# 插入排序,怎麼找到插入的地方??,並將元素後移並返回位置。。開始寫了個三重迴圈 = =
def insert(list):
l = len(list)
for i in range(l):
# 這裡用for迴圈比較彆扭,畢竟外層的迴圈並不知道j的值,但這樣這程式依然跑的通
# 這裡是j-1而不是j,是j的話,迴圈直接跳過了
# 右移操縱需要逆序遍歷,左移是正序遍歷list[i] = list[i + 1]
# tmp = list[i]
# for j in range(i, -1, -1):
# if tmp < list[j - 1]:
# list[j] = list[j - 1]
# else:
# break
# list[j] = tmp
# 建議用while迴圈寫,清晰明了,後移陣列且要得到j的值
tmp = list[i]
j = i
# 這裡是and不是&,而且比較的是tmp和list[j-1]而不是list[j]和list[j-1],!!j在一直變化,自己寫問題還是多啊
while tmp < list[j - 1] and j > 0:
list[j] = list[j - 1]
j = j - 1
list[j] = tmp
return list
# 待修改
# 希爾排序,插入排序的改進
def shell(list):
step = len(list) // 2#python3中//為向下取整
while step > 0:
# 以下為按步長的類似插入排序。。和插入排序類似,不理解的先去理解下插入排序,這裡多了個step步長,插入排序是後移,這裡是交換
for i in range(step, len(list)):
while(i >= step and list[i] < list[i - step]):
list[i], list[i - step] = list[i - step], list[i]
i = i - step #建議到模擬一下理解過程,i和i-step之間的關係
step = step // 2
return list
# 寫了bubble就繼續寫高階版的快排--都是交換型別的排序(個人認為,選擇排序應該也算是交換類的排序8
# 演算法導論的寫法,對遞迴理解還是不好。。自己還是不會
def quicksort(list, left ,right):
if left < right:
base = partition(list, left, right)
quicksort(list, left, base - 1)
quicksort(list, base + 1, right)
# partition函式是關鍵,i代表小於list[right]的個數,j遍歷整個部分,滿足條件i+1,i和j下標進行交換
def partition(list, left, right):
# i代表有多少個比基準值小的書,放在左邊
i = left - 1
for j in range(left, right):
if list[j] <= list[right]:
i = i + 1
list[i], list[j] = list[j], list[i]
list[i + 1], list[right] = list[right], list[i + 1]
return i + 1
# print(bubble(l))
# print(select(l))
# print(insert(l))
# print(shell(l))
# quicksort(l, 0, len(l) - 1)
# print(l)
# t0 = time.time()
# bubble(l)
# print(l)
# print(time.time() - t0)
# for i in range(len(l)):
# if i not in l:
# print(i)
排序演算法Python
廢話不說直接看 計數排序 def countsort datalist 最終排好序的陣列 b 0 len datalist 計算用來儲存計數的陣列c的長度 maxnum max datalist minnum min datalist clength maxnum minnum 1 c 0 clen...
Python 排序演算法
python 排序演算法 持續更新ing 內建排序 氣泡排序 0 n 2 插入排序 選擇排序 希爾排序 堆排排序 快排排序 歸併排序 呼叫方法預設排序 a 9,5,8,7,4,3,1,6,2,0 a.sort print a 呼叫方法預設排序 a 9,5,8,7,4,3,1,6,2,0 b sort...
Python 排序演算法
lst 4,3,6,9,2,1 1 氣泡排序 依次把最大的數字往後移動 def bubble sort lst for i in range len lst 1 for j in range len lst 1 i if lst j 1 lst j lst j 1 lst j lst j lst j...