十大經典排序演算法之選擇排序(Selection Sort)
選擇排序(Selection-sort)是一種簡單直觀的排序演算法。
它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。
2.1 演算法描述
n個記錄的直接選擇排序可經過n-1趟直接選擇排序得到有序結果。具體演算法描述如下:
- 初始狀態:無序區為R[1..n],有序區為空;
- 第i趟排序(i=1,2,3…n-1)開始時,當前有序區和無序區分別為R[1..i-1]和R(i..n)。該趟排序從當前無序區中-選出關鍵字最小的記錄 R[k],將它與無序區的第1個記錄R交換,使R[1..i]和R[i+1..n)分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區;
- n-1趟結束,陣列有序化了。
2.2 動圖演示
2.3 例題分析
有一陣列 int[] arr={5,2,8,4,9,1};使用選擇排序每一趟的結果如下:
-------------------------------------------------------
第一趟排序: 原始資料:5 2 8 4 9 1
最小資料1,把1放在首位,也就是1和5互換位置,
排序結果:1 2 8 4 9 5
-------------------------------------------------------
第二趟排序:
第1以外的資料{2 8 4 9 5}進行比較,2最小,
排序結果:1 2 8 4 9 5
-------------------------------------------------------
第三趟排序:
除1、2以外的資料{8 4 9 5}進行比較,4最小,8和4交換
排序結果:1 2 4 8 9 5
-------------------------------------------------------
第四趟排序:
除第1、2、4以外的其他資料{8 9 5}進行比較,5最小,8和5交換
排序結果:1 2 4 5 9 8
-------------------------------------------------------
第五趟排序:
除第1、2、4、5以外的其他資料{9 8}進行比較,8最小,8和9交換
排序結果:1 2 4 5 8 9
-------------------------------------------------------
2.4 程式碼展示
import java.util.Scanner;
//選擇排序
public class SelectionSort {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("請輸入元素的個數:");
int n = sc.nextInt();
int arr[] = new int[n];
System.out.println("請依次輸入元素:");
for (int i = 0; i < arr.length; i++) {
arr[i] = sc.nextInt();
}
System.out.println("排序前的元素如下:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
for (int i = 0; i < arr.length - 1; i++) {// 做第i趟排序
int k = i;//最小值預設是無序空間第一個元素的下標(也就是i)
for (int j = k + 1; j < arr.length; j++) {//尋找最小的數
if (arr[j] < arr[k]) {
k = j;//記下目前找到的最小值所在的位置
}
}
//在內層迴圈結束,也就是找到本輪迴圈的最小的數以後,再進行交換
if (i != k) {
int temp = arr[i];
arr[i] = arr[k];
arr[k] = temp;
}
}
System.out.println("排序後的元素如下:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
}
2.5 執行結果
2.6 小結
選擇排序是表現最穩定的排序演算法之一,因為無論什麼資料進去都是O(n2)的時間複雜度,所以用到它的時候,資料規模越小越好。唯一的好處可能就是不佔用額外的記憶體空間了吧。理論上講,選擇排序可能也是平時排序一般人想到的最多的排序方法了吧。