Python數據結構與算法—排序和查找

排序和查找

排序(Sort)是將無序的記錄序列(或稱文件)調整成有序的序列。

常見排序方法:算法

  • 冒泡排序

冒泡排序是一種簡單的排序算法。它重複地走訪過要排序的數列,一次比較兩個元素,若是他們的順序錯誤就把他們交換過來。走訪數列的工做是重複地進行直到沒有再須要交換,也就是說該數列已經排序完成。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))
二分查找代碼
相關文章
相關標籤/搜索