選擇排序的本質(zhì)就是篩查列表中的最小值论巍,然后進(jìn)行數(shù)據(jù)元素的交換箩艺。
選擇排序也是需要將列表分為已排序和未排序兩部分,我們每次對(duì)未排序的部分進(jìn)行篩查找到其中的最小值然后添加的已排序部分埋同。我們默認(rèn)取列表的左邊部分為已排序部分劳较,右邊部分為列表的未排序部分驹止,已排序和未排序的關(guān)系是已排序部分增加的下標(biāo)是未排序部分的起始下標(biāo)(具體提現(xiàn)即:當(dāng)從未排序部分篩查出最小值之后需要將這個(gè)元素與未排序部分的起始元素進(jìn)行交換,這樣隨著下次進(jìn)行選擇操作時(shí)未排序起始位置下標(biāo)的增加观蜗,篩查出來(lái)的元素就自動(dòng)劃分給了已排序部分)臊恋。默認(rèn)情況下列表的已排序部分為0,未排序部分占據(jù)整個(gè)列表墓捻。接下來(lái)我們看一下具體的實(shí)現(xiàn):
package com.lijianjian.test;
public class SelectSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] ar = { 9, 12, 3, 45, 11, 2 };
selectSort(ar);
for (int i = 0; i < ar.length; i++) {
System.out.println("i value is =" + ar[i]);
}
}
/**
* 選擇排序的原理是將列表分為未排序和已排序部分 每次從未排序部分中獲取最小值(或者最大值)放入已排序部分中
* 需要知道未排序的第一個(gè)下標(biāo)和當(dāng)前選擇操作中未排序部分最小值的下標(biāo) 將兩個(gè)元素的值互換
*
* 我們選則將列表的前面部分劃為已排序部分
*/
private static void selectSort(int[] array) {
int minIndex = 0;// 標(biāo)識(shí)未排序部分的最小值的下標(biāo) 默認(rèn)取未排序列表的第一個(gè)元素抖仅,后續(xù)的選擇操作會(huì)覆蓋掉這個(gè)值
for (int i = 1; i < array.length; i++) {
// 外層循環(huán)用來(lái)限制執(zhí)行選擇操作的次數(shù),i代表第幾次執(zhí)行選擇操作(i-1代表著未排序部分的起始下標(biāo))
// i<array.length表示最多可以執(zhí)行(array.length-1)次選擇操作(當(dāng)只剩下一個(gè)元素的時(shí)候是不用進(jìn)行排序的)
minIndex=i-1;
for (int j = i; j < array.length; j++) {
// 內(nèi)層循環(huán) 執(zhí)行選擇操作 從未排序的部分中選出最小值
if (array[minIndex] > array[j]) {
minIndex = j;
}
}
// 將篩選出來(lái)的最小值添加進(jìn)已排序部分
if (minIndex >= i) {
array[minIndex] = array[minIndex] + array[i - 1];
array[i - 1] = array[minIndex] - array[i - 1];
array[minIndex] = array[minIndex] - array[i - 1];
}
}
}
}