Java常見排序演算法之選擇排序詳解
阿新 • • 發佈:2018-12-15
一、簡介
選擇排序,就是每一趟從待排序的序列中選出最小的元素,順序放在已排好序的序列最後,直到全部序列排序完畢。簡單理解就是假設一個最小值,將剩餘的未排序的序列與假設的最小值進行比較,如果發現比假設的最小值還小的值,那麼將它與假設的最小值調換位置。
二、排序思路
排序思路:(假設從小到大)
【1】待排序陣列: int[] array = {5, 6, 3, 7, 2, 1};
【2】第1趟排序,在待排序資料array[0]~array[n-1]中選出最小的資料,將它與array[0]交換;
【3】第2趟排序,在待排序資料array[1]~array[n-1]中選出最小的資料,將它與array[1]交換;
【4】以此類推,第i趟在待排序資料array[i-1]~array[n-1]中選出最小的資料,將它與array[i-1]交換,直到全部排序完成。
三、演算法實現
/** * @Title: SelectionSortUtils * @ProjectName java_sort * @Description: 選擇排序工具類 * @Author WeiShiHuai * @Date 2018/10/16 9:35 * <p> * 選擇排序: * 原理: 每一趟從待排序的記錄中選出最小的元素,順序放在已排好序的序列最後,直到全部記錄排序完畢 * <p> * 思路: * 1. 待排序陣列: int[] array = {5, 6, 3, 7, 2, 1}; * 2. 第1趟排序,在待排序資料array[0]~array[n-1]中選出最小的資料,將它與array[0]交換; * 3. 第2趟排序,在待排序資料array[1]~array[n-1]中選出最小的資料,將它與array[1]交換; * 4. 以此類推,第i趟在待排序資料array[i-1]~array[n-1]中選出最小的資料,將它與array[i-1]交換,直到全部排序完成。 */ public class SelectionSortUtils { public static int[] sort(int[] array) { int length = array.length - 1; //外層迴圈控制迴圈的次數 for (int i = 0; i < length; i++) { //假設每一趟第一個元素都是最小值,記錄當前索引 int minIndex = i; //從剩餘未排序序列中找到最小值下標 for (int j = i + 1; j < length + 1; j++) { if (array[j] < array[minIndex]) { //記錄當前最小值下標 minIndex = j; } } //如果本身就是最小值下標,則不需要交換 if (minIndex != i) { int temp = array[i]; array[i] = array[minIndex]; array[minIndex] = temp; } System.out.println("第" + (i + 1) + "趟" + Arrays.toString(array)); } return array; } }
測試:
public class Test { public static void main(String[] args) { int[] arr = {5, 6, 3, 7, 2, 1}; System.out.println("排序前: " + Arrays.toString(arr)); int[] sortedArr = SelectionSortUtils.sort(arr); System.out.println("排序後: " + Arrays.toString(sortedArr)); } }
測試結果:
四、原理分析
下圖是對選擇排序演算法每一步排序的理解以及交換思路:
五、總結
本文是作者在複習選擇排序演算法的一些總結以及思路,僅供大家參考學習,一起學習一起進步。