選擇排序基礎(java實現)


算法實現:

紅寶書版本:

public class Selection
{
 public static void sort(Comparable[] a)
  {
      int N=a.length;
      for (int i=0;i<N;i++)
         { 
            int min=i;
              for(int j=i+1;j<N;j++)
                 if (lessa([j],a[min])) min =j;
              exch(a,i,min);
         }
  }
}

 

基於int數組的實現:

public static void selectSort(int[]a)
{
    int minIndex=0;
    int temp=0;
    if((a==null)||(a.length==0))
        return;
    for(int i=0;i<a.length-1;i++)
    {
        minIndex=i;//無序區的最小數據數組下標
        for(intj=i+1;j<a.length;j++)
        {
            //在無序區中找到最小數據並保存其數組下標
            if(a[j]<a[minIndex])
            {
                minIndex=j;
            }
        }
        if(minIndex!=i)
        {
            //如果不是無序區的最小值位置不是默認的第一個數據,則交換之。
            temp=a[i];
            a[i]=a[minIndex];
            a[minIndex]=temp;
        }
    }
}

注:除去前者定義的less(Comparable a, Comparable b) 和 exch(Comparable[] a,int a,int b)簡化了代碼之外,還有一個字面上的區別,即外層for循環中的判定條件一個是i<N、另一個是i<N-1;其實i=N-1時,需要被比較的最后一個數必然已經是最大的數了,不需要進行交換;不過只有一次比較操作,兩者沒什么本質區別。

 選擇排序的本質即從第一位開始,遍歷之后的所有剩余元素,找出其中最小的一個放到第一位;接下來再從第二位開始,找出數組中第二小的數,依次類推。

選擇排序有兩個重要特點:

  1. 運行時間和輸入無關

即不論數組的初始狀態的有序程度,選擇排序的比較次數都沒有變化。考慮到比較次數與元素個數的關系是N²/2,所以當一個已經比較有序的數組使用選擇排序會很不划算。

      2.數據的移動操作最少

移動操作次數是一個常量,最多為N,其他的算法都不具備這個特征。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM