選擇排序演算法的原理:
選擇排序是從氣泡排序演化而來的,每一輪(趟)比較出最小的那個值,放到第乙個位置,然後在每輪的無序區中選出最小的值放到第二個位置。
目的:從小到大排序
圖示:
演算法的關鍵點是:有序區跟無序區、無序區最小的位置
首先我們寫乙個簡單的選擇排序,用到python的內建模組:
#思路是我們建立乙個新列表,將原列表中的最小數選出後新增到新列表的中,實現排序。
#定義乙個簡單的選擇排序
defselect_sort_******
(li)
: list_new =
for i in
range
(len
(li)):
min_num =
min(li)
li.remove(min_num)
return list_new
li =[2
,5,1
,7,4
,9,3
,0]print
(select_sort_******(li)
)
結果:[0, 1, 2, 3, 4, 5, 7, 9]
缺點:
回歸主線,使用**解釋選擇排序演算法,我們的需求是什麼===》不產生新列表,並且每趟將原列表無序區中最小的數放在第乙個位置、第二個位置…
換種說法就是先找出原列表的最小值然後與列表的第乙個位置上的元素進行交換。
最多需要n趟,每趟出來乙個數,但是n-1趟結束後,無序區只剩乙個數不要走一邊,所以我們最多需要n-1趟,每一趟都需要便利無序區,無序區的範圍是:第0趟:從0到最後,第1趟:從1到最後,…所以無序區的範圍:i+1 — len(i)。
我們還需要記錄最小值的位置:min_loc = i(假定無序區的第乙個位置為最小值)
#選擇排序的優解
defselect_sort
(li)
:for i in
range
(len
(li)-1
):min_loc = i
for j in
range
(i+1
,len
(li)):
if li[j]
< li[min_loc]
:#無序區第乙個數小於最小值
min_loc = j #賦值
li[min_loc]
,li[i]
= li[i]
,li[min_loc]
#兩個數交換
print
(li)
li =[2
,5,1
,7,4
,9,3
,0]print
(li)
select_sort(li)
結果:
[2, 5, 1, 7, 4, 9, 3, 0]
[0, 5, 1, 7, 4, 9, 3, 2]
[0, 1, 5, 7, 4, 9, 3, 2]
[0, 1, 2, 7, 4, 9, 3, 5]
[0, 1, 2, 3, 4, 9, 7, 5]
[0, 1, 2, 3, 4, 9, 7, 5]
[0, 1, 2, 3, 4, 5, 7, 9]
[0, 1, 2, 3, 4, 5, 7, 9]
DAY05(冒泡,選擇排序)
1 氣泡排序 優化前 public class maopao 分析 前乙個與後乙個比較大小,如果前乙個比後乙個大則交換順序,每一次迴圈,得到的就是最大的那個數在末尾 假設陣列元素有2 5 1 6 3 迴圈第0次 2 5 1 6 3 2 1 5 6 3 2 1 5 6 3 比較了,沒交換 2 1 5 ...
05快速排序
快速排序是實踐中已知的最快的排序演算法,他的平均執行時間為o n logn 最壞情形的效能為o n 2 一 選取樞紐元的幾種方法 1 糟糕的方法 通常的做法是選擇陣列中第乙個元素作為樞紐元,如果輸入是隨機的,那麼這是可以接受的。但是,如果輸入序列是預排序的或者是反序的,那麼依據這樣的樞紐元進行劃分則...
day05 插入,歸併,快速,選擇排序演算法總結
前面幾天在學習基礎的排序演算法,從o n 級別到o n 級別的演算法,今天就不學習新的排序演算法了,停下來把之前學習的進行鞏固一下,並且好好分析一下這幾種演算法之間的區別,以及他們分別適用於什麼樣的情景。選擇排序的思想正如它的名字,重點就在選擇。怎麼個選擇法呢?選擇排序會從當前陣列中,每次選出乙個最...