其實在我心中有兩大最基礎(chǔ)的簡單排序蓝厌,一個是關(guān)于本系列的第一個算法——冒泡排序玄叠,另外一個就是本文要講的直接選擇排序,從某種意義上拓提,我認(rèn)為直接選擇排序才是本人心中最簡單的排序诸典,也是最符合正常人的思維邏輯:
從N大小的數(shù)組中,找到最小的數(shù)字崎苗,把它和第1個位置的數(shù)字互換狐粱,這樣我們進(jìn)行第一次選擇就確定了排序的第1個位置的數(shù)據(jù)。
接下來胆数,從剩下沒排好序的子數(shù)組中找到最小值肌蜻,與第2個位置的數(shù)據(jù)進(jìn)行互換,這樣確定了排序的第2個位置的數(shù)據(jù)必尼。
按照上述方式直到排完所有的順序……
其實蒋搜,仔細(xì)想來,冒泡排序和直接選擇排序的核心思想是一樣的:
目的都是每輪將最小/大值放到對應(yīng)隊列首/尾判莉,然后去按照同樣邏輯排剩下的元素
只不過二者的實現(xiàn)方式不同:
冒泡排序是通過相鄰兩個數(shù)據(jù)互相交換的方式將極值放到列表尾/首;
而直接選擇排序是直接遍歷數(shù)組確定極值后將其放到列表尾/首豆挽。
下圖是直接選擇排序的示意圖:
直接選擇排序.png
代碼直接貼,看到兩個循環(huán)券盅,時間復(fù)雜度果斷:
private static void straightSelectSort(int[] arrays, int start, int end) {
for (int i = start; i < end; i++) {
int minIndex = i;
for (int j = i + 1; j <= end; j++) {
if (arrays[minIndex] > arrays[j]){
minIndex = j;
}
}
// 將[i,end]區(qū)間的最小值與i位置的值互換
if (minIndex != i){
swap(arrays, i , minIndex);
}
}
}
同冒泡排序那樣帮哈,既然講了選擇排序中一個簡單的排序算法,下次就講一個相對難一些的選擇排序算法——堆排序锰镀,提前需要掌握兩個知識點:完全二叉樹和堆娘侍,然后堆排序也就不難了,可以理解為堆排序利用了堆這個數(shù)據(jù)結(jié)構(gòu)的特性泳炉,因而使得排序更加高效憾筏,其時間復(fù)雜度為: