簡單選擇排序
從待排序的數列中選擇一個最小的數,放到有序數列的最後一位,最始的有序數列就是無序數列的第一個數,就相當於用數列的第一個元素分別與其它元素比較,選出最小數的下標,然後將最小數與有序數列的最一個數交換位置。因爲每次選擇的都是最小的數,所以經過排序之後,待排序數列變成有序(待排序數列中選擇的最小的數實際上是有序數列中最大的數,因爲比它更小的數已在上一次比較的時候被提到有序數列了)。
時間複雜度:O(n2)
java代碼實現
/**
* 選擇排序
* @param a
*/
public static void selectSort(int[] a){
//取數組長度
int len = a.length;
//取待排序數列中的第一個數做爲最小的數
for (int i = 0 ;i<len -1;i++){
int min = i;
for (int j = i+1;j<len;j++){
//用設定的最小的數與待排序數列中的每一個數比較
if (a[min] > a[j]){
//如果發現假設的最小的數不是真正的最小的數,則將比他小的數的下標賦值給min
min = j;
}
}
if(min != i){//min不等於i,假設的最小值不是最小值,把真正的最小值交換到i的位置上去
swap(a,min,i);
}
//打印每次選擇排序的結果
print(a,a.length,i+1);
}
//打印最終排序結果
printResult(a,a.length);
}
交換方法:
public static void swap(int[] elem,int i,int j){
int temp = elem[i];
elem[i] = elem[j];
elem[j] = temp;
}
打印每次比較結果的方法:
/**
* 打印每次比較的結果
* @param a 待排序數組
* @param n 數組長度
* @param i 第幾次排序
*/
public static void print(int[] a,int n,int i){
System.out.println("第"+i+"次");
for (int j =0;j<n;j++){
System.out.print(" "+a[j]);
}
System.out.println();
}
打印最終結果的方法:
/**
* 打印最終排序結果
* @param a
* @param n
*/
public static void printResult(int[] a,int n){
System.out.println("最終排序結果:");
for(int j = 0 ;j<n;j++){
System.out.print(" "+a[j]);
}
System.out.println();
}
結語:關於算法的性能分析,最好的方法就是在實際操作中進行體會,如果實在覺得有些地方不好理解,可以用筆畫一下方法思路。