2.選擇排序
實(shí)現(xiàn)思想:選擇排序也稱為直接選擇排序(面試不用提),默認(rèn)將第一個(gè)作為最小值,遍歷一次當(dāng)前最小值向后移一位,將前面找出的最小值,看成一個(gè)有序列表,后面的看成無(wú)序列表,然后找出無(wú)序列表中最小值然后與最小值參照物進(jìn)行對(duì)比替換。
選擇與冒泡的區(qū)別:①選擇排序一般是找最小值,冒泡可以升序與降序;②選擇是選擇每一個(gè)下標(biāo)作為最小值參照物,分為了有序列表與無(wú)序列表,冒泡排序無(wú)參照物;③冒泡排序最好時(shí)間復(fù)雜度是O(n),選擇排序時(shí)間復(fù)雜度都是O(n^2);④選擇排序因?yàn)橹貜?fù)對(duì)比的原因,有可能出現(xiàn)兩個(gè)相同值位置不同,也就是不穩(wěn)定.
簡(jiǎn)單來(lái)說(shuō):冒泡排序就是將每一個(gè)數(shù)與所有數(shù)進(jìn)行比較,將最小(大)數(shù)放到最前面的排序算法;選擇排序就是將前面排序好的有序列表的最小值與后面待排序的無(wú)序列表進(jìn)行比較,找出最小值的排序算法。
選擇排序首次引進(jìn)了參照物的概念。
package deepinsea.十大經(jīng)典排序算法;
import java.util.Arrays;
/**
* @author deepinsea
* 時(shí)間復(fù)雜度:O(n^2) 最好:O(n^2) 最壞:O(n^2)
*/
public class 選擇排序 {
public static void main(String[] args) {
int[] arr = new int[]{2, 1, 5, 8, 2, 9, 7, 6};
System.out.println(Arrays.toString(arr));
selectSort(arr);
System.out.println(Arrays.toString(arr));
}
/**
* 選擇排序
*/
public static int[] selectSort(int[] arr){
for (int i = 0; i < arr.length; i++) {
// 默認(rèn)將第一個(gè)作為最小值,依次根據(jù)下標(biāo)變化當(dāng)前無(wú)序列表中的最小值
int min = arr[i];
// 記錄最小值的下標(biāo)
int index = i;
//通過(guò)與后面的數(shù)據(jù)進(jìn)行比較得出最小值和下標(biāo)
for (int j = i + 1; j < arr.length; j++) {
if (min > arr[j]) {
// 記錄無(wú)序列表中的最小值與下標(biāo)
min = arr[j];
index = j;
}
}
// 將無(wú)序列表中的最小值與當(dāng)前最小值參照物進(jìn)行對(duì)比替換
// 第一個(gè)最小值其實(shí)已經(jīng)是最小的了,后面有序列表的參照物依次從小到大
// 這樣其實(shí)會(huì)造成重復(fù)比較,所以最好與最壞時(shí)間復(fù)雜度都是O(n^2)
// 相對(duì)而言(對(duì)交換排序),冒泡排序優(yōu)于選擇排序
int temp = arr[i];
arr[i] = min;
arr[index] = temp;
}
return arr;
}
}