級別: ★☆☆☆☆
標簽:「算法」「選擇排序」「Selection Sort」
作者: MrLiuQ
審校: QiShare團隊
本篇將重點介紹選擇排序,在講解選擇排序之前,我們先復習一下數組和鏈表等知識。
一、數組 or 鏈表?
數組和鏈表作為常用的存儲數據結構,有各自的優勢與劣勢。
- 數組的優勢在于查詢速度快。
- 鏈表的優勢在于插入與刪除速度快。
下面是兩者的時間復雜度:
/ | 數組 | 鏈表 |
---|---|---|
讀取 | O(1) | O(n) |
插入 | O(n) | O(1) |
刪除 | O(n) | O(1) |
為什么呢?
這與數組與鏈表的存儲方式有關。
數組是順序存儲,而鏈表是鏈式存儲。
- 順序存儲:所存儲的內存區域是連續的。
- 鏈式存儲:所存儲的內存區域是非連續的。
舉個例子:圖解一下
因此,當我們所存儲的數據經常查詢,則選擇數組好一些。
如果我們的數據經常被操作,并且數據長度經常發生變化,則選擇鏈表好一些。
關于數組的內存存儲還有幾個小知識點:
對于不可變數組來說,每一次重新賦值都是一次內存整體遷移,相當于開辟了一塊新內存存儲數據。
對于可變數組來說,系統會預留內存位置,當可變數組的大小超過這個預留內存大小時,會做整體數據遷移,會遷移到一塊更大的預留內存位置。
二、選擇排序
我們先來看一下選擇排序的算法流程:
解釋:
1.每一次循環 找到 未排序隊列中的最小值的index。(n次)
2.再與前置位交換,未排序隊列元素數-1
3.重復n次,得出最終排序隊列。
故時間復雜度 = O(n2)
下面是基于python
的實現代碼:
- 每一次循環 找到 未排序隊列中的最小值的index。(n次)
def findSmallest(arr):
smallest = arr[0]
smallest_index = 0
for i in range(1, len(arr)):
if arr[i] < smallest:
smallest = arr[i]
smallest_index = i
return smallest_index
- 再與前置位交換,未排序隊列元素數-1。(也可以加入新數組)
def selectionSort(arr):
newArr = []
for i in range(len(arr)):
smallest = findSmallest(arr)
newArr.append(arr.pop(smallest))
return newArr
- 完整示例代碼:
def findSmallest(arr):
smallest = arr[0]
smallest_index = 0
for i in range(1, len(arr)):
if arr[i] < smallest:
smallest = arr[i]
smallest_index = i
return smallest_index
def selectionSort(arr):
newArr = []
for i in range(len(arr)):
smallest = findSmallest(arr)
newArr.append(arr.pop(smallest))
return newArr
print selectionSort([5, 3, 2, 10, 6, 4, 7])
工程源碼:QiAlgorithms的2-2demo
推薦文章:
iOS Runloop(一)
iOS 常用調試方法:LLDB命令
iOS 常用調試方法:斷點
iOS 常用調試方法:靜態分析
iOS消息轉發
iOS 自定義拖拽式控件:QiDragView
iOS 自定義卡片式控件:QiCardView
iOS Wireshark抓包
iOS Charles抓包