Java排序算法之直接選擇排序
基本過程:假設一序列為R[0]~R[n-1],第一次用R[0]和R[1]~R[n-1]相比較,若小於R[0],則交換至R[0]位置上。第二次從R[1]~R[n-1]中選取最小值,與R[1]交換,....,第i次從R[i-1]~R[n-1]中選取最小值,與R[i-1]交換,.....,第n-1次從R[n-2]~R[n-1]中選取最小值,與R[n-2]交換,總共通過n-1次,得到一個按排序碼從小到大排列的有序序列。
Java代碼實現:
public class Xuanze { public static void main(String[] args) { int [] s = {8,3,2,1,7,4,6,5}; int temp = 0; for(int i=0;i<s.length-1;i++){ for(int j=i+1;j<s.length;j++){ if(s[i]>s[j]){ temp=s[i]; s[i]=s[j]; s[j]=temp; } } } for(int value:s) System.out.print(value); } }
上面排序方法存在效率問題。因為當我們發現當前數比被比較數小的時候我們就交換兩個數,其實我們可以把當前數的位置保存下來,等到第一次比較完后在進行交換。
public class Xuanze { public static void main(String[] args) { int [] s = {8,3,2,1,7,4,6,5}; int temp = 0; for(int i=0;i<s.length-1;i++){ temp = i; for(int j=i+1;j<s.length;j++){ if(s[temp]>s[j]){ temp=j; //保存位置 } } if(temp!=i) exchang(s,i,temp); //進行交換 } for(int value:s) System.out.print(value); } private static void exchang(int[] s, int i, int j) { int temp = s[j]; s[j]=s[i]; s[i]=temp; } }
算法性能分析:
時間復雜度:假設有n個數據,數據交換的次數最多為n-1次,但程序的總體的比較次數較多。所以綜合考慮有直接選擇排序的時間復雜度為O(n2)
(n的平方)。所以當記錄占用字節數較多時,通常比直接插入排序的執行速度快些。
空間復雜度:直接選擇排序的空間復雜度很好,它只需要一個附加單元用於數據交換,所以其空間復雜度為O(1)。
穩定性:在一趟選擇,如果當前元素比一個元素小,而該小的元素又出現在一個和當前元素相等的元素后面,那么 交換后穩定性就被破壞了。舉個例子,序列5 8 5 2 9, 我們知道第一遍選擇第1個元素5會和2交換,那么原序列中2個5的相對前后順序就被破壞了,所以選擇排序不是一個穩定的排序算法。
