剛剛寫完了冒泡排序备韧,激動的我停不下來辞居,然后馬上看了選擇排序焙矛。
發(fā)現(xiàn)果然踩過前面的坑之后葫盼,現(xiàn)在自己學起來會快很多。
所以各位學習的童鞋村斟,你們對于數(shù)據(jù)結(jié)構(gòu)和算法方面的學習一定要持之以恒贫导,相信終有一天會練成傳說中的無敵神功。
哈哈蟆盹,畢竟這么遲鈍的我也在慢慢努力孩灯。但是我堅信:“所有的夢想都會因努力而不期而遇”!
算法基本思想:
從所有序列中先找到最小的逾滥,然后放到第一個位置峰档。之后再看剩余元素中最小的,放到第二個位置……以此類推寨昙,就可以完成整個的排序工作了讥巡。可以很清楚的發(fā)現(xiàn)舔哪,選擇排序是固定位置欢顷,找元素,然后交換捉蚤。
示意圖
代碼實現(xiàn):
選擇排序是不穩(wěn)定的吱涉。分析可以看出刹泄,對于一個長度為n的數(shù)組擒抛,需要進行n-1趟操作椅野,才能完全確保排序完成脯燃,時間復雜度為O(n^2)虐先。
import java.util.Arrays;
public class SelectionSort {
public static void sort(int[] arr) {
int len = arr.length;
int slcIndex;
int tmp;
System.out.println("原始順序: " + Arrays.toString(arr));
for (int i = 0; i < len - 1; i++) {
//依次選擇前n-1個數(shù)彰居,以索引作為依據(jù)
slcIndex = i;
for (int j = i + 1; j < len; j++) {
//與被選中的數(shù)之后的每個數(shù)進行比較
if (arr[j] < arr[slcIndex]) {
//存在更小的數(shù)浊竟,替換索引
slcIndex = j;
}
}
//交換數(shù)據(jù)
if (slcIndex != i) {
tmp = arr[i];
arr[i] = arr[slcIndex];
arr[slcIndex] = tmp;
}
System.out.println("第" + (i + 1) + "趟排序:" + Arrays.toString(arr));
}
}
public static void main(String[] args) {
int[] arr = new int[10];
//初始化數(shù)組
for (int i = 0; i < 10; i++) {
arr[i] = (int) (Math.random() * (100 + 1));
}
SelectionSort.sort(arr);
}
}
運行結(jié)果:
運行結(jié)果