算法實現:
紅寶書版本:
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時,需要被比較的最后一個數必然已經是最大的數了,不需要進行交換;不過只有一次比較操作,兩者沒什么本質區別。
選擇排序的本質即從第一位開始,遍歷之后的所有剩余元素,找出其中最小的一個放到第一位;接下來再從第二位開始,找出數組中第二小的數,依次類推。
選擇排序有兩個重要特點:
- 運行時間和輸入無關
即不論數組的初始狀態的有序程度,選擇排序的比較次數都沒有變化。考慮到比較次數與元素個數的關系是N²/2,所以當一個已經比較有序的數組使用選擇排序會很不划算。
2.數據的移動操作最少
移動操作次數是一個常量,最多為N,其他的算法都不具備這個特征。