? ? ? 說到選擇排序,可能會想起冒泡排序。
????????冒泡排序和選擇排序不禁會問它們有什么區(qū)別? 的確, 它們的基本思想是一樣的. 都是通過一輪的循環(huán)找到所要排序數(shù)中的最值(最大值或最小值), 然后將最?。ù螅┲抵糜诘锥撕晚敹?,它們的區(qū)別主要體現(xiàn)在對其他數(shù)(不是最值)的處理上.?
冒泡排序: 通過相鄰的兩個(gè)數(shù)的比較, 根據(jù)需要決定是否將兩個(gè)數(shù)互換位置, 然后將比較往前(或往后)推進(jìn).?
????????例如, 要求從小到大排序. 通過將兩個(gè)數(shù)比較, 將較大的數(shù)置換到右邊. 如此不斷循環(huán)將得到最值.
選擇排序: 這個(gè)算法從名字可以看出來的意思是從序列中選擇出最小的數(shù)放在隊(duì)列頭,或者將最大的數(shù)放在隊(duì)列尾也是一樣的道理。和冒泡排序不同, 選擇排序使用標(biāo)記最值所在位置的方式, 查找最值過程中不移動數(shù)位置, 只是在最后將最值置換到頂端.
? ??????注意選擇排序與冒泡排序的區(qū)別:冒泡排序通過依次交換相鄰兩個(gè)順序不合法的元素位置,從而將當(dāng)前最?。ù螅┰胤诺胶线m的位置;而選擇排序每遍歷一次都記住了當(dāng)前最?。ù螅┰氐奈恢?,最后僅需一次交換操作即可將其放到合適的位置。
? ? ? ? 話不多說來段代碼先:
// 選擇排序
public static class SelectionSort {
public static void main(String[] args) {
? ? ? ? int[] arr={1,3,2,45,65,33,12};
? ? ? ? System.out.println("交換之前:");
? ? ? ? for(int num:arr){
? ? ? ? ? ? System.out.print(num+" ");
? ? ? ? }? ? ? ?
? ? ? ? //選擇排序的優(yōu)化
? ? ? ? for(int i = 0; i < arr.length - 1; i++) {// 做第i趟排序
? ? ? ? ? ? int k = i;
? ? ? ? ? ? for(int j = k + 1; j < arr.length; j++){// 選最小的記錄
? ? ? ? ? ? ? ? if(arr[j] < arr[k]){
? ? ? ? ? ? ? ? ? ? k = j; //記下目前找到的最小值所在的位置
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? //在內(nèi)層循環(huán)結(jié)束,也就是找到本輪循環(huán)的最小的數(shù)以后,再進(jìn)行交換
? ? ? ? ? ? if(i != k){? //交換a[i]和a[k]
? ? ? ? ? ? ? ? int temp = arr[i];
? ? ? ? ? ? ? arr[i] = arr[k];
? ? ? ? ? ? ? ? arr[k] = temp;
? ? ? ? ? ? }? ?
? ? ? ? }
? ? ? ? System.out.println();
? ? ? ? System.out.println("交換后:");
? ? ? ? for(int num:arr){
? ? ? ? ? ? System.out.print(num+" ");
找來了動態(tài)圖示,可以更加方便的去理解,選擇排序。這種比文字更好的去理解。
下面圖示選擇排序? ? ↓↓↓:

【圖解算法】排序算法 :https://blog.csdn.net/xiaoping0915/article/details/72615195
Java中的經(jīng)典算法之選擇排序:https://www.cnblogs.com/shen-hua/p/5424059.html