選擇排序 原理
從左至右遍歷,找到最小(大)的元素,然後與第乙個元素交換。
從剩餘未排序元素中繼續尋找最小(大)元素,同第二個元素進行交換。
以此類推,直到所有元素均排序完畢。
原理圖圖1:
圖2:
選擇排序需要花費 (n – 1) + (n – 2) + … + 1 + 0 = n(n- 1) / 2 ~ n2/2次比較 和 n-1次交換操作。
對初始資料不敏感,不管初始的資料有沒有排好序,都需要經歷n2/2次比較,這對於一些原本排好序,或者近似排好序的序列來說並不具有優勢。在最好的情況下,即所有的排好序,需要0次交換,最差的情況,倒序,需要n-1次交換。
資料交換的次數較少,如果某個元素位於正確的最終位置上,則它不會被移動。在最差情況下也只需要進行n-1次資料交換,在所有的完全依靠交換去移動元素的排序方法中,選擇排序屬於比較好的一種。
python**實現:
def
sort_choice
(numbers, max_to_min=true):
""" 我這沒有按照標準的選擇排序,假設列表長度為n,思路如下:
1、獲取最大值x,將x移動到列最後。[n1, n2, n3, ... nn]
2、將x追加到排序結果[n1, n3, ... nn, n2]
3、獲取排序後n-1個元素[n1, n3, ... nn],重複第一步,重複n-1次。
max_to_min是指從大到小排序,預設為true;否則從小到大排序。
對[8, 4, 1, 0, 9]排序,大致流程如下:
sorted_numbers =
[8, 4, 1, 0, 9], sorted_numbers = [9]
[4, 1, 0, 8], sorted_numbers = [9, 8]
[1, 0, 4], sorted_numbers = [9, 8, 4]
[0, 1], sorted_numbers = [9, 8, 4, 1]
[0], sorted_numbers = [9, 8, 4, 1, 0]
"""if len(numbers) <= 1:
return numbers
sorted_list =
index = 0
for i in xrange(len(numbers) - index):
left_numbers = _get_left_numbers(numbers, max_to_min)
numbers = left_numbers[:-1]
index += 1
return sorted_list
def_get_left_numbers
(numbers, get_max=true):
''' 獲取最大值或者最小值x,並且將x抽取出來,置於列表最後.
ex: get_max=true, [1, 4, 3] ⇒ [1, 3, 4]
get_max=false, [1, 4, 3] ⇒ [4, 3 ,1]
'''max_index = 0
for i, num in enumerate(numbers):
if get_max:
if num > numbers[max_index]:
max_index = i
else:
if num < numbers[max_index]:
max_index = i
numbers = numbers[:max_index] + numbers[max_index + 1:] + [numbers[max_index]]
return numbers
測試一下:
>>> get_left_numbers([0, 4, 0, 31, 9, 19, 89,67], get_max=true)
[0, 4, 0, 31, 9, 19, 67, 89]
>>> get_left_numbers([0, 4, 0, 31, 9, 19, 89,67], get_max=false)
[4, 0, 31, 9, 19, 89, 67, 0]
>>> sort_choice([0, 4, 0, 31, 9, 19, 89,67], max_to_min=false)
[0, 0, 4, 9, 19, 31, 67, 89]
>>> sort_choice([0, 4, 0, 31, 9, 19, 89,67], max_to_min=true)
[89, 67, 31, 19, 9, 4, 0, 0]
python 排序演算法 選擇排序
所謂選擇排序,它是排序演算法中,一種簡單 直觀且靈巧的排序演算法,但是速度不是很快。選擇排序,見名思意就是選擇乙個元素,與其他元素進行比較,將乙個個的最大或最小值拿出來,放到另乙個列表中的這個過程,或者說行為我們稱之為選擇排序。1 首先得有乙個需要排序的列表,比如數字列表 2 拿到這個列表以後,我們...
Python 演算法 選擇排序
coding utf 8 選擇排序 defselect sort lst 基本思想 第1趟,在待排序記錄r1 r n 中選出最小的記錄,將它與r1交換 第2趟,在待排序記錄r2 r n 中選出最小的記錄,將它與r2交換 以此類推,第i趟在待排序記錄r i r n 中選出最小的記錄,將它與r i 交換...
python演算法 選擇排序
眾所周知,我們記憶體的工作原理就像我們逛商場時的存物櫃,每個櫃子只能放進乙個物品,你有兩樣物品要存,將物品存進 放進 櫃子裡後,你就可以去逛商場了 計算機就是多個櫃子的集合,每個單獨的櫃子都有自己的位址 而當我們需要存多個資料的時候,我們有兩種基本方式 陣列和鍊錶 我們還是拿我們的日常生活舉個栗子,...