python實現折半查找算法&&歸並排序算法


今天依舊是學算法,前幾天在搞bbs項目,界面也很丑,評論功能好像也有BUG。現在不搞了,得學下算法和數據結構,筆試過不了,連面試的機會都沒有……

今天學了折半查找算法,折半查找是蠻簡單的,但是歸並排序我就挺懵比,看教材C語言寫的歸並排序看不懂,后來參考了別人的博客,終於搞懂了。

 

折半查找

先看下課本對於 折半查找的講解。注意了,折半查找是對於有序序列而言的。每次折半,則查找區間大約縮小一半。low,high分別為查找區間的第一個下標與最后一個下標。出現low>high時,說明目標關鍵字在整個有序序列中不存在,查找失敗。

看我用python編程實現:

 1 def BinSearch(array, key, low, high):  2     mid = int((low+high)/2)  3     if key == array[mid]:  # 若找到
 4         return array[mid]  5     if low > high:  6         return False  7 
 8     if key < array[mid]:  9         return BinSearch(array, key, low, mid-1) #遞歸 10     if key > array[mid]: 11         return BinSearch(array, key, mid+1, high) 12 
13 
14 
15 if __name__ == "__main__": 16     array = [4, 13, 27, 38, 49, 49, 55, 65, 76, 97] 17     ret = BinSearch(array, 76, 0, len(array)-1)  # 通過折半查找,找到65
18     print(ret)

輸出: 在列表中查找76.

76

時間復雜度:O(logn)

 

歸並排序算法

先闡述一下排序思路:

首先歸並排序使用了二分法,歸根到底的思想還是分而治之。歸並排序是指把無序的待排序序列分解成若干個有序子序列,並把有序子序列合並為整體有序序列的過程。長度為1的序列是有序的。因此當分解得到的子序列長度大於1時,應繼續分解,直到長度為1.

(下圖是分解過程,圖自http://www.cnblogs.com/piperck/p/6030122.html)

合並的過程如下:

 

很好,你現在可以和別人說,老子會歸並排序了。但是讓你寫代碼出來,相信你是不會的……

來來來,看我用python寫的歸並排序算法:

 1 def merge_sort(array):  # 遞歸分解
 2     mid = int((len(array)+1)/2)  3     if len(array) == 1:  # 遞歸結束的條件,分解到列表只有一個數據時結束
 4         return array  5     list_left = merge_sort(array[:mid])  6     list_right = merge_sort(array[mid:])  7     print(">>>list_left:", list_left)  8     print(">>>list_right:", list_right)  9     return merge(list_left, list_right)  # 進行歸並
10 
11 
12 def merge(list_left, list_right):  # 進行歸並
13     final = [] 14     while list_left and list_right: 15         if list_left[0] <= list_right[0]:  # 如果將"<="改為"<",則歸並排序不穩定
16  final.append(list_left.pop(0)) 17         else: 18  final.append(list_right.pop(0)) 19 
20     return final+list_left+list_right  # 返回排序好的列表
21 
22 
23 if __name__=="__main__": 24     array = [49, 38, 65, 97, 76] 25     print(merge_sort(array))

輸出:

>>>list_left: [49]
>>>list_right: [38]
>>>list_left: [38, 49]
>>>list_right: [65]
>>>list_left: [97]
>>>list_right: [76]
>>>list_left: [38, 49, 65]
>>>list_right: [76, 97]
[38, 49, 65, 76, 97]

 

時間度雜度: 平均情況=最好情況=最壞情況=O(nlogn)

空間復雜度: O(n)

穩定性: 穩定

 

對序列{ 6, 5, 3, 1, 8, 7, 2, 4 }進行歸並排序的實例如下:

 

 使用歸並排序為一列數字進行排序的宏觀過程:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM