1. 程式人生 > >演算法學習第二記-選擇排序

演算法學習第二記-選擇排序

  這篇文章我們來講講選擇排序這種排序演算法的原理及其效率分析,首先選擇排序的實現思路是將待排序序列分為兩段,一段為已排序區間,另一段為未排序區間。所以排序的操作是每次從未排序區間的最左邊那個元素開始,向右查詢最小元素,找到後與當前元素進行交換,同時已排序區間的元素就多了一個了,下面給上示意圖:

下面給出選擇排序的程式碼:

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順序就變了,所以就不穩定了。