如何寫代碼: 01.提煉問題 要明確需求 02.分析問題 -->動腦子 產出:思路報告 即我是怎麼想到的 03.落實到代碼 04.實例測試 看看可否知足需求 若是不能那麼請debug 05.時間和空間複雜度 目的: 算法的入門篇 10種排序算法和3種查找算法 參考: 《數據結構和算法 python語言描述》 查找: 01.線性查找 def seq_find(array,target): found = False for ele in array: if ele == target: found = True return found 02.二分查找 def binary_search(array,target) found = False start = 0 end = len(array) -1 while first <= last and not found: middle = (start+end) //2 if array[middle] == target: found = True else: if array[middle] > target: end = middle -1 else: start = middle + 1 return found 03.hash查找 hash查找知道時間複雜度是1就能夠了吧?經常使用的hash取餘的算法 仍是解決衝突的算法 不必了 排序:01-04是簡單的排序 05-07是複雜排序 08-10是線性排序 01.插入排序 提煉問題:很明確,要求咱們經過插入的方式實現排序,重點在插入 分析問題:首先第一個元素是有序的,那麼只須要將後續的元素插入到合適的位置便可; 後續元素如何處理呢?好比pos=k的元素 只須要將該元素的值提煉出來 依次和前邊的元素pos-1進行比較,直至pos>0或者lst[pos-1]< value of k 代碼: def insert_sort(lst): for index in range(1,len(lst)): pos = index val = lst[index] while pos >0 and val < lst[pos-1]: lst[pos] = lst[pos-1] pos = pos -1 lst[pos] = val 測試: array = [25,67,54,33,20,78,65,49,17,56,44] insert_sort(array) print array 時間和空間複雜度:O(n**2) O(1) 02.冒泡排序 提煉問題:像冒泡同樣 相鄰元素兩兩比較 直至最大的到最後 分析問題:以N個元素的列表爲例,須要進行N-1次冒泡,第一次冒泡須要N-1次比較 第二次冒泡須要比較N-2次 第N-1次須要比較1次 代碼: def bubble_sort(lst): pass_num = len(lst)-1 for num in range(pass_num,0,-1): for i in range(num): if lst[i] > lst[i+1]: lst[i],lst[i+1] = lst[i+1],lst[i] 測試: array = [25,67,54,33,20,78,65,49,17,56,44] bubble_sort(array) print array 時間和空間複雜度:O(n**2) O(1) 03.選擇排序 提煉問題:重在選擇 分析:假設index=0的元素值最大,遍歷一遍 選出最大的放到末尾 如此遍歷N次 代碼: def insert_sort(lst): for index in range(1, len(lst)): pos = index val = lst[index] while pos > 0 and val < lst[pos - 1]: lst[pos] = lst[pos - 1] pos = pos - 1 lst[pos] = val 測試: array = [25, 67, 54, 33, 20, 78, 65, 49, 17, 56, 44] insert_sort(array) print array 時間和空間複雜度:O(n**2) O(1) 04. 如何寫代碼: 01.提煉問題 要明確需求 02.分析問題 -->動腦子 產出:思路報告 即我是怎麼想到的 03.落實到代碼 04.實例測試 看看可否知足需求 若是不能那麼請debug 05.時間和空間複雜度 目的: 算法的入門篇 10種排序算法和3種查找算法 參考: 《數據結構和算法 python語言描述》 查找: 01.線性查找 def seq_find(array,target): found = False for ele in array: if ele == target: found = True return found 02.二分查找 def binary_search(array,target) found = False start = 0 end = len(array) -1 while first <= last and not found: middle = (start+end) //2 if array[middle] == target: found = True else: if array[middle] > target: end = middle -1 else: start = middle + 1 return found 03.hash查找 hash查找知道時間複雜度是1就能夠了吧?經常使用的hash取餘的算法 仍是解決衝突的算法 不必了 排序:01-04是簡單的排序 05-07是複雜排序 08-10是線性排序 01.插入排序 提煉問題:很明確,要求咱們經過插入的方式實現排序,重點在插入 分析問題:首先第一個元素是有序的,那麼只須要將後續的元素插入到合適的位置便可; 後續元素如何處理呢?好比pos=k的元素 只須要將該元素的值提煉出來 依次和前邊的元素pos-1進行比較,直至pos>0或者lst[pos-1]< value of k 代碼: def insert_sort(lst): for index in range(1,len(lst)): pos = index val = lst[index] while pos >0 and val < lst[pos-1]: lst[pos] = lst[pos-1] pos = pos -1 lst[pos] = val 測試: array = [25,67,54,33,20,78,65,49,17,56,44] insert_sort(array) print array 時間和空間複雜度:O(n**2) O(1) 02.冒泡排序 提煉問題:像冒泡同樣 相鄰元素兩兩比較 直至最大的到最後 分析問題:以N個元素的列表爲例,須要進行N-1次冒泡,第一次冒泡須要N-1次比較 第二次冒泡須要比較N-2次 第N-1次須要比較1次 代碼: def bubble_sort(lst): pass_num = len(lst)-1 for num in range(pass_num,0,-1): for i in range(num): if lst[i] > lst[i+1]: lst[i],lst[i+1] = lst[i+1],lst[i] 測試: array = [25,67,54,33,20,78,65,49,17,56,44] bubble_sort(array) print array 時間和空間複雜度:O(n**2) O(1) 03.選擇排序 提煉問題:重在選擇 分析:假設index=0的元素值最大,遍歷一遍 選出最大的放到末尾 如此遍歷N次 代碼: def insert_sort(lst): for index in range(1, len(lst)): pos = index val = lst[index] while pos > 0 and val < lst[pos - 1]: lst[pos] = lst[pos - 1] pos = pos - 1 lst[pos] = val 測試: array = [25, 67, 54, 33, 20, 78, 65, 49, 17, 56, 44] insert_sort(array) print array 時間和空間複雜度:O(n**2) O(1) 04.希爾排序 不是重點 不寫了 有空再補上吧 05.歸併排序 提煉問題:8 4 2 1 分析:兩兩合併 而後遞歸 代碼: def merge(list_l,list_r): point_l = 0 point_r = 0 res = [] while point_l < len(list_l) and point_r < len(list_r): if list_l[point_l] < list_r[point_r]: res.append(list_l[point_l]) point_l += 1 else: res.append(list_r[point_r]) point_r += 1 res += list_l[point_l:] res += list_r[point_r:] return res def merge_sort(lst): if len(lst) <= 1: return lst middle = len(lst)//2 left = merge_sort(lst[:middle]) right = merge_sort(lst[middle:]) return merge(left,right) array = [25,67,54,33,20,78,65,49,17,56,44] print merge_sort(array) 06.快速排序 代碼: # -*- coding:utf-8 -*- def quick_sort(lst): quick_sort_rec(lst,0,len(lst)-1) def quick_sort_rec(lst,first,last): if first < last: split_point = partition(lst,first,last) quick_sort_rec(lst,first,split_point-1) quick_sort_rec(lst,split_point+1,last) def partition(lst,first,last): pivot_value = lst[first] left_mark = first + 1 right_mark = last done = False while not done: while left_mark <= right_mark and lst[left_mark] <= pivot_value: left_mark = left_mark + 1 while lst[right_mark] >= pivot_value and right_mark >= left_mark: right_mark = right_mark - 1 if right_mark < left_mark: done = True else: temp = lst[left_mark] lst[left_mark] = lst[right_mark] lst[right_mark] = temp temp = lst[first] lst[first] = lst[right_mark] lst[right_mark] = temp return right_mark array = [54, 26, 93, 17, 77, 31, 44, 55, 20] quick_sort(array) print array 07.堆排序 留到二叉樹部分 08-10.基數排序、桶排序、計數排序 基本用不到 用到再聊吧 桶排序可能會有