演算法學習第二記-選擇排序
阿新 • • 發佈:2018-11-24
這篇文章我們來講講選擇排序這種排序演算法的原理及其效率分析,首先選擇排序的實現思路是將待排序序列分為兩段,一段為已排序區間,另一段為未排序區間。所以排序的操作是每次從未排序區間的最左邊那個元素開始,向右查詢最小元素,找到後與當前元素進行交換,同時已排序區間的元素就多了一個了,下面給上示意圖:
下面給出選擇排序的程式碼:
void Select_Sort(int arr[],int length) { for(int i=0;i<length;i++) { int min=i; for(int j=i+1;j<length;j++) if(arr[j]<arr[min]) min=j; if(min!=i) swap(arr[i],arr[min]); } }
下面我們來分析下選擇排序的效率:
首先選擇排序沒有利用到額外的空間,所以它的空間複雜度是O(1),屬於原地排序演算法。選擇排序最好最壞平均都為O(n²),簡單來看的話外層迴圈執行n次,每一次的內層迴圈分別執行n-1,n-2,n-3........,很容易看出來是一個等差數列,等差數列前n項和為n*(n-1)/2,所以它的時間複雜度為O(n²)。
那麼選擇排序是一種穩定排序演算法麼?恐怕不是。從前面一張圖可以看出,選擇排序每次都要找剩餘未排序元素中的最小值,並和前面的元素交換位置,這樣破壞了穩定性。
比如 5,8,5,2,9這樣一組資料,使用選擇排序演算法來排序的話,第一次找到最小元素2,與第一個5和中間的5順序就變了,所以就不穩定了。