1. 程式人生 > 實用技巧 >演算法學習(二)選擇排序

演算法學習(二)選擇排序

一、引言

  上一篇學習了氣泡排序,還是比較簡單的一種排序,這一篇學習一下選擇排序,也是基礎排序的其中一種,手寫一遍,加上自己的註釋,理解以後寫圖例,其實演算法也不是很高深的東西,記錄一下~~

二、選擇排序演算法

選擇演算法工具類

/**
 * 選擇排序演算法工具類
 */
public class XuanZeUtil {

    /**
     * 選擇排序【對外暴露靜態方法】
     */
    public static void selectSort(int[] arr) {
        System.out.println("========排序前的陣列,元素為:" + showItem(arr) + "========");
        
//1、對資料迴圈,取出資料比較 for (int i = 0; i < arr.length - 1; i++) { //2、設定min變數,用於存放較小元素的陣列下標,這樣當前批次比較完畢時,最終存放的就是此趟內最小的元素的下標 int min = i; //3、再次對資料迴圈,取出資料比較【每一趟比較的元素越來越少,j = i + 1】 for (int j = i + 1; j < arr.length; j++) { if (arr[j] < arr[min]) { min
= j; } } //4、內層迴圈結束時,如果min發生變化,則進行交換 if (min != i) { //5、從新定義一個變數temp,作為交換變數用 int temp = arr[i]; arr[i] = arr[min]; arr[min] = temp; } System.out.println("第【" + (i + 1) + "】次排序後的陣列,元素為:" + showItem(arr) + "========"); } }
/** * 返回陣列字串 */ public static String showItem(int[] arr) { String itemStr = ""; if (null != arr) { itemStr = "【 "; for (int item : arr) { itemStr = itemStr + " " + item; } itemStr += " 】"; } return itemStr; } }

測試類

import algorithm.XuanZeUtil;

/**
 * 選擇排序工具測試類
 */
public class XuanZeTest {
    public static void main(String[] args) {
        //1、設定亂序陣列
        int[] arr = {1, 8, 3, 6, 9, 4, 5};
        //2、呼叫選擇排序工具類
        XuanZeUtil.selectSort(arr);
    }
}

解析

  基本思想:每一趟從待排序的資料元素中選擇最小(或最大)的一個元素作為首元素,直到所有元素排完為止,簡單選擇排序是不穩定排序。

  時間複雜度:O(n2)

  圖解:

  圖中可看出,選擇排序有以下特點:

  • 每次排序過後,下一輪排序所需要對比的元素都會減少1
  • 總共會經歷n - 1次陣列遍歷,才最終完成排序過程,每次遍歷一共比較 n - i -1 次(n為陣列長度)