選擇排序基本思想
首先選取數(shù)組的第一項當做考察對象,循環(huán)遍歷數(shù)組的每一項找到最小項的下標署咽,將第一項和最小項交換位置生音,接著考察第二項,依次類推慕匠。瑟由。。
代碼解析
考慮到需要交換數(shù)組內(nèi)兩項直接的位置青伤,我們先寫一個交換位置的函數(shù):
/**
* 交換數(shù)組中索引a和索引b的值得位置
* @param {* 需要改變的數(shù)組} arr
* @param {* 第一個值得索引} a
* @param {* 第二個值得索引} b
*/
function swap(arr, a, b) {
var temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
接下來我們看看排序的具體寫法:
/**
* 選擇排序方法
* @param {* 需要排序的數(shù)組} arr
* @param {* 數(shù)組的長度} n
*/
selectionSort = (arr, n) => {
for (let i = 0; i < n; i++) {
let minIndex = i
for (let j = i + 1; j < n; j++) {
//arr[j] < arr[minIndex] 可以抽象成一個函數(shù) 例如less()return一個boolean
//更高的抽象可以將這個less函數(shù)以函數(shù)指針的傳遞進來 這個樣函數(shù)就更靈活
if (arr[j] < arr[minIndex]) {
//儲存當前最小值的下標
minIndex = j
}
}
// [arr[minIndex], arr[j]] = [arr[j], arr[minIndex]]
swap(arr, i, minIndex)
}
}
示例代碼是從小到大的順序來排列的狠角,minIndex的值始終保存著數(shù)組中最下值得下標丰歌。
當然我們可以改變if判斷的內(nèi)容來靈活的使用選擇排序屉凯,
代碼中在也用到了es6的結構賦值的方式來交換數(shù)組內(nèi)的位置,根據(jù)實際測試晓勇,測試10000數(shù)據(jù)的時候預計多消耗.3s的性能。推薦使用swap函數(shù)的方式來實現(xiàn)
冒泡排序基本思想
- 比較相鄰的元素绰筛。如果第一個比第二個大铝噩,就交換他們兩個窿克。
- 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對让歼。在這一點,最后的元素應該會是最大的數(shù)硬猫。
- 針對所有的元素重復以上的步驟啸蜜,除了最后一個。
- 持續(xù)每次對越來越少的元素重復上面的步驟衬横,直到?jīng)]有任何一對數(shù)字需要比較蜂林。
示例代碼如下:
/**
* 冒泡排序
* @param {* 需要排序的數(shù)組} arr
* @param {* 數(shù)組長度} n
*/
bubbleSort = (arr, n) => {
for (i = 0; i < n - 1; i++) {
for (j = 0; j < n - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
var temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
// log(arr)
}
}
代碼解析:
主要就說一下兩次遍歷拇泣,第一層循環(huán)0 <= i < n-1 因為當i到n-2的時候i數(shù)組就沒有可以比較的了。第二層循環(huán)0 <= j <n-1-i霉翔,為什么要剪掉一個i债朵?每次循環(huán)完成一次混亂數(shù)組里面最大值就到數(shù)組的最后變成有序數(shù)組的一部分,也就不需要考察到了臭杰,
以上都是個人理解如有不對之處還望指正交流谚中!