排序演算法入門之 選擇排序

2021-10-25 01:22:29 字數 1957 閱讀 7836

擋板法」這個經典思想。

擋板左邊是已排序區間,右邊是未排序區間,那麼每次的「選擇」是去找右邊未排序區間的最小值,找到之後和擋板後面的第乙個值換一下,然後再把擋板往右移動一位,保證排好序的這些元素在擋板的左邊。

比如之前的例子:

我們用乙個擋板來分隔陣列是否排好序, 用指標 j 來尋找未排序區間的最小值;

第一輪 j 最初指向 5,然後遍歷整個未排序區間,最終指向 0,那麼 0 就和擋板後的第乙個元素換一下,也就是和 5 交換一下位置,擋板向右移動一位,結束第一輪。

第二輪,j 從擋板後的2開始遍歷,最終指向1,然後1和擋板後的第乙個元素 2 換一下,擋板向右移動一位,結束第二輪。

第三輪,j 從2開始遍歷,最終指向2,然後和2自己換一下,擋板向右移動一位,結束第三輪。

還剩乙個元素,不用遍歷了,就結束了。

選擇排序與之前的插入排序對比來看,要注意兩點:

擋板必須從 0 開始,而不能從 1 開始。雖然在這兩種演算法中,擋板的物理意義都是分隔已排序和未排序區間,但是它們的已排序區間裡放的元素的意義不同:

所以選擇排序的擋板左邊最開始不能有任何元素。

在外層迴圈時,

所以加起來,總共是: (n-1) + (n-2) + … + 1 = n*(n-1) / 2 = o(n^2)

是這樣算出來的,而不是一拍腦袋說兩層迴圈就是 o(n^2).

這個很簡單,最多的情況是 call swap() 的時候,然後 call stack 上每一層就用了幾個有限的變數,所以是 o(1)。

那自然也是原地排序演算法了。

這個答案是否定的,選擇排序並沒有穩定性。

因為交換的過程破壞了原有的相對順序,比如: 這個例子,第一次交換是 0 和 第乙個 5 交換,於是第乙個 5 跑到了陣列的最後一位,且再也無翻身之地,所以第乙個 5 第二個 5 的相對順序就已經打亂了。

選擇排序的其中一步是選出每一輪的最小值,那麼這一步如果使用 heapify() 來優化,就可以從 o(n) 優化到 o(logn),這其實就變成了 heapsort.

我是小齊,紐約程式媛,終生學習者,每天晚上 9 點,雲自習室裡不見不散!

更多乾貨文章見我的 github:

排序演算法入門之 選擇排序

選擇排序也是利用了 擋板法 這個經典思想。擋板左邊是已排序區間,右邊是未排序區間,那麼每次的 選擇 是去找右邊未排序區間的最小值,找到之後和擋板後面的第乙個值換一下,然後再把擋板往右移動一位,保證排好序的這些元素在擋板的左邊。比如之前的例子 我們用乙個擋板來分隔陣列是否排好序,用指標 j 來尋找未排...

排序演算法入門之 選擇排序

選擇排序也是利用了 擋板法 這個經典思想。擋板左邊是已排序區間,右邊是未排序區間,那麼每次的 選擇 是去找右邊未排序區間的最小值,找到之後和擋板後面的第乙個值換一下,然後再把擋板往右移動一位,保證排好序的這些元素在擋板的左邊。比如之前的例子 我們用乙個擋板來分隔陣列是否排好序,用指標 j 來尋找未排...

排序演算法入門 選擇排序

選擇排序 選擇排序也是利用了 擋板法 這個經典思想。擋板左邊是已排序區間,右邊是未排序區間,那麼每次的 選擇 是去找右邊未排序區間的最小值,找到之後和擋板後面的第乙個值換一下,然後再把擋板往右移動一位,保證排好序的這些元素在擋板的左邊。比如例子 我們用乙個擋板來分隔陣列是否排好序,用指標 j 來尋找...