常見排序方法:算法
冒泡排序是一種簡單的排序算法。它重複地走訪過要排序的數列,一次比較兩個元素,若是他們的順序錯誤就把他們交換過來。走訪數列的工做是重複地進行直到沒有再須要交換,也就是說該數列已經排序完成。ide
1 # 冒泡 2 def bubble(list_): 3 # 外層循環表達比較多少輪 4 for i in range(len(list_) - 1): 5 #內層循環把控比較次數 6 for j in range(len(list_) - 1 - i): 7 if list_[j] > list_[j + 1]: 8 list_[j],list_[j + 1] = \ 9 list_[j + 1],list_[j]
工做原理爲,首先在未排序序列中找到最小元素,存放到排序序列的起始位置,而後,再從剩餘未排序元素中繼續尋找最小元素,而後放到排序序列末尾。以此類推,直到全部元素均排序完畢。ui
1 # 選擇 2 def select(list_): 3 # 外層循環控制比較多少輪 4 for i in range(len(list_) - 1): 5 min = i # 假定list_[i] 爲最小值 6 for j in range(i+1,len(list_)): 7 if list_[min] > list_[j]: 8 min = j 9 # 若是i不是最小值則交換 10 if min != i: 11 list_[i],list_[min] = \ 12 list_[min],list_[i]
對於未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入。插入排序在實現上,一般在從後向前掃描過程當中,須要反覆把已排序元素逐步向後挪位,爲最新元素提供插入空間。spa
1 # 插入 2 def insert(list_): 3 # 控制每次x選取的待插入數值 4 for i in range(1,len(list_)): 5 x = list_[i] # 選取待處理的數 6 j = i - 1 7 while j >=0 and list_[j] > x: 8 list_[j + 1] = list_[j] 9 j -= 1 10 list_[j + 1] = x
步驟:code
從數列中挑出一個元素,稱爲 "基準"(pivot),
從新排序數列,全部元素比基準值小的擺放在基準前面,全部元素比基準值大的擺在基準的後面(相同的數能夠到任一邊)。在這個分區退出以後,該基準就處於數列的中間位置。這個稱爲分區(partition)操做。
遞歸地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。blog
1 # 完成一輪排序過程 2 def sub_sort(list_,low,high): 3 # 基準數 4 x = list_[low] 5 while low < high: 6 # 後面的數小於x放到前面的空位 7 while list_[high] >= x and high > low: 8 high -= 1 9 list_[low] = list_[high] # 將數往前甩 10 while list_[low] < x and low < high: 11 low += 1 12 list_[high] = list_[low] 13 list_[low] = x # 將基準數插入 14 return low 15 16 17 # 快排 low 第一個數序列號 high 最後一個數序列號 18 def quick(list_,low,high): 19 if low < high: 20 key = sub_sort(list_,low,high) 21 quick(list_,low,key - 1) 22 quick(list_, key+1, high)
當數據量很大適宜採用該方法。採用二分法查找時,數據需是排好序的。排序
1 # 對有序數列進行二分查找 2 def search(list_,key): 3 low,high = 0,len(list_) - 1 4 while low <= high: 5 mid = (low + high) // 2 6 if list_[mid] < key: 7 low = mid + 1 8 elif list_[mid] > key: 9 high = mid - 1 10 else: 11 return mid 12 13 l = [1,2,3,4,5,6,7,8,9,10] 14 print("Key index is:",search(l,12))