冒泡排序(英語:Bubble Sort)是一種簡單的排序算法。它重複地遍歷要排序的數列,一次比較兩個元素,若是他們的順序錯誤就把他們交換過來。遍歷數列的工做是重複地進行直到沒有再須要交換,也就是說該數列已經排序完成。這個算法的名字由來是由於越小的元素會經由交換慢慢「浮」到數列的頂端。python
冒泡排序算法的運做以下:算法
#!/usr/bin/env python3 # -*- coding: utf-8 -*-\\ def bubble_sort(alist): """Sort the elements with Bubble method :aList: one list :returns: List with sorted values """ for i in range(len(alist)-1, 0, -1): for j in range(i): if alist[j] > alist[j+1]: temp = alist[j+1] alist[j+1] = alist[j] alist[j] = temp if __name__ == "__main__": one_list = [54, 26, 93, 17, 77, 31, 44, 55] bubble_sort(one_list) print(one_list)
選擇排序(Selection sort)是一種簡單直觀的排序算法。它的工做原理以下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,而後,再從剩餘未排序元素中繼續尋找最小(大)元素,而後放到已排序序列的末尾。以此類推,直到全部元素均排序完畢。性能
選擇排序的主要優勢與數據移動有關。若是某個元素位於正確的最終位置上,則它不會被移動。選擇排序每次交換一對元素,它們當中至少有一個將被移到其最終位置上,所以對n個元素的表進行排序總共進行至多n-1次交換。在全部的徹底依靠交換去移動元素的排序方法中,選擇排序屬於很是好的一種。ui
#!/usr/bin/env python3 # -*- coding: utf-8 -*- def selection_sort(alist): """TODO: Docstring for selection_sort. :returns: TODO """ n = len(alist) for i in range(n-1): # record the index of the min value min_index = i # pick the min value from the i+1 to max index for j in range(i+1, n): if alist[j] < alist[min_index]: min_index = j # if data is not in the true index, exchange them if min_index != i: alist[i], alist[min_index] = alist[min_index], alist[i] # temp = alist[min_index] # alist[min_index] = alist[i] # alist[i] = temp if __name__ == "__main__": test_list = [2, 7, 12, 0, 8, 22, 1] selection_sort(test_list) print(test_list)
快速排序(英語:Quicksort),又稱劃分交換排序(partition-exchange sort),經過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的全部數據都比另一部分的全部數據都要小,而後再按此方法對這兩部分數據分別進行快速排序,整個排序過程能夠遞歸進行,以此達到整個數據變成有序序列。code
步驟爲:排序
def quick_sort(alist, start, end): """快速排序""" # 遞歸的退出條件 if start >= end: return # 設定起始元素爲要尋找位置的基準元素 mid = alist[start] # low爲序列左邊的由左向右移動的遊標 low = start # high爲序列右邊的由右向左移動的遊標 high = end while low < high: # 若是low與high未重合,high指向的元素不比基準元素小,則high向左移動 while low < high and alist[high] >= mid: high -= 1 # 將high指向的元素放到low的位置上 alist[low] = alist[high] # 若是low與high未重合,low指向的元素比基準元素小,則low向右移動 while low < high and alist[low] < mid: low += 1 # 將low指向的元素放到high的位置上 alist[high] = alist[low] # 退出循環後,low與high重合,此時所指位置爲基準元素的正確位置 # 將基準元素放到該位置 alist[low] = mid # 對基準元素左邊的子序列進行快速排序 quick_sort(alist, start, low-1) # 對基準元素右邊的子序列進行快速排序 quick_sort(alist, low+1, end) alist = [54,26,93,17,77,31,44,55,20] quick_sort(alist,0,len(alist)-1) print(alist)
數據不排序的線性查找,遍歷數據元素。
算法分析:最好狀況是在第一個位置就找到了,此爲O(1);最壞狀況在最後一個位置才找到,此爲O(n);因此平均查找次數爲(n+1)/2。最終時間複雜度爲O(n)遞歸
#!/usr/bin/env python # -*- coding: utf-8 -*- def sequential_search(lis, key): """search one key in one sequential with unordered. :lis: one list :key: the search value :returns: index """ length = len(lis) for i in range(length): if lis[i] == key: return i else: return False if __name__ == "__main__": origin_list = [1, 5, 8, 123, 22, 54, 7, 99, 300, 222] result = sequential_search(origin_list, 44) print(result)
二分查找又稱折半查找,優勢是比較次數少,查找速度快,平均性能好;其缺點是要求待查表爲有序表,且插入刪除困難。所以,折半查找方法適用於不常常變更而查找頻繁的有序列表。utf-8
# 非遞歸實現 def binary_search(alist, item): first = 0 last = len(alist)-1 while first<=last: midpoint = int((first + last)/2) if alist[midpoint] == item: return True elif item < alist[midpoint]: last = midpoint-1 else: first = midpoint+1 return False testlist = [0, 1, 2, 8, 13, 17, 19, 32, 42,] print(binary_search(testlist, 3)) print(binary_search(testlist, 13)) ## 遞歸實現 def binary_search(alist, item): if len(alist) == 0: return False else: midpoint = len(alist)//2 if alist[midpoint]==item: return True else: if item<alist[midpoint]: return binary_search(alist[:midpoint],item) else: return binary_search(alist[midpoint+1:],item) testlist = [0, 1, 2, 8, 13, 17, 19, 32, 42,] print(binary_search(testlist, 3)) print(binary_search(testlist, 13))