排序演算法 python

2021-09-02 06:46:21 字數 3564 閱讀 7556

"""

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...