1. 程式人生 > >十大經典排序演算法之選擇排序(Selection Sort)

十大經典排序演算法之選擇排序(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)的時間複雜度,所以用到它的時候,資料規模越小越好。唯一的好處可能就是不佔用額外的記憶體空間了吧。理論上講,選擇排序可能也是平時排序一般人想到的最多的排序方法了吧。