排序
排序(Sort)是將無序的記錄序列(或稱文件)調整成有序的序列。排序方法有很多種,下面舉例說明:
冒泡排序
冒泡排序是一種簡單的排序算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。
示例:
list_data = [8, 9, 6, 5, 7, 4, 1, 2, 3]
# 冒泡排序
def bubbling_sort(data):
for i in range(len(data) - 1):
for j in range(i + 1, len(data)):
# 從頭開始,每取一個元素都和後面的所有元素相比
if data[i] > data[j]:
data[i], data[j] = data[j], data[i]
快速排序
從數列中挑出一個元素,稱爲 "基準"(pivot),重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分區退出之後,該基準就處於數列的中間位置。這個稱爲分區(partition)操作。 遞歸地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。
示例:
list_data = [8, 9, 6, 5, 7, 4, 1, 2, 3]
def sub_sort(data, low, high):
# 將第一個值作爲基礎值備份出來
key = data[low]
while low < high:
# 從後面開始將小於基礎值的元素往前移動到最前面
while low < high and data[high] > key:
high -= 1
data[low] = data[high]
# 從前面開始將大於基礎值的元素往後移動到最後面
while low < high and data[low] < key:
low += 1
data[high] = data[low]
# 前後索引集中在一起時結束,將基礎值填充進去,並返回所在索引
data[low] = key
return low
def quick(data, low, high):
# low 開頭索引
# high 末尾索引
if low < high:
key = sub_sort(data, low, high)
# 將利用基礎值分割的左右兩部分迭代進行處理,直到結束
quick(data, low, key - 1)
quick(data, key + 1, high)
插入排序
對於未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入,插入排序在實現上,通常在從後面向前掃描過程中,需要反覆把已排序元素逐步向後挪威,爲最新元素提供插入空間
示例:
list_data = [8, 9, 6, 5, 7, 4, 1, 2, 3]
def insert_sort(data):
for i in range(1, len(data)):
# 從第二個開始取一個值
x = data[i]
# 當前索引
j = i
# 往前依次找比當前值大的進行交換,直到沒有
while j > 0 and data[j - 1] > x:
data[j] = data[j - 1]
j -= 1
# 將取到值插入進去
data[j] = x
選擇排序
工作原理爲,首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小元素,然後放到排序序列末尾。以此類推,直到所有元素均排序完畢
示例:
list_data = [8, 9, 6, 5, 7, 4, 1, 2, 3]
def choose_sort(data):
for i in range(len(data) - 1):
# 假定本次是最小
min_index = i
for j in range(i + 1, len(data)):
# 發現後面有比本次還小,則標記它爲最小
if data[j] < data[min_index]:
min_index = j
# 如果最小的不是本次最小則交換位置
if min_index != i:
data[i], data[min_index] = data[min_index], data[i]
查找
二分法查找
例如,隨機一個1~100中的數,猜一猜數字是幾,我們會先猜中數50,如果小了就會接着猜75,如果是大了就會接着猜25,以此類推。
data = [i for i in range(1, 101)]
# 找出指定數據的下標
def search(data, key):
low = 0
high = len(data) - 1
while low <= high:
mid = (low + high) // 2
if data[mid] > key:
high = mid - 1
elif data[mid] < key:
low = mid + 1
else:
return mid
return -1
print(search(data, 80))