1. 排序
1.1.冒泡排序
- 每一輪比較,從左至右交換相鄰,每輪結束,最后一個為最大
- 下一輪,需要比較的個數 - 1
j < len - i
(范圍動態縮小) - 共 len - 1 輪比較
function bubbleSort(arr) {var len = arr.length;for (var i = 1; i < len; i++) {for (var j = 0; j < len - i; j++) {if (arr[j] > arr[j+1]) { //相鄰元素兩兩對比var temp = arr[j+1]; //元素交換arr[j+1] = arr[j];arr[j] = temp;}}}return arr;
}
冒泡排序算法改進思想:
- 個數較多的排序,(比如)從第6輪開始,數列已經有序,然而排序算法依然會執行第7、8輪直到結束:添加標志,一開始為1,只要有交換便置為0,在外層循環里添加if判斷,if(標志為1) { break }
- 當序列中某一段在比較之前就已經就是有序的:可以在每一輪排序的最后,記錄下最后一次元素交換的位置,那個位置也就是無序數列的邊界,再往后就是有序區了
- 正反向冒泡排序
function bubbleSort(arr) {console.time('冒泡排序耗時')var len = arr.lengthvar lastChangeIndex = 0 // 初始,最后一次交換位置var sortBorder = len -1 // 初始有序邊界為最后一值for (var i = 1; i < len; i++) {var isSorted = truefor (var j = 0; j < sortBorder; j++) {if (arr[j] > arr[j+1]) { //相鄰元素兩兩對比var temp = arr[j+1] //元素交換arr[j+1] = arr[j]arr[j] = tempisSorted = falselastChangeIndex = j}}sortBorder = lastChangeIndexif(isSorted) {break}}console.timeEnd('冒泡排序耗時')return arr
}var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48]
console.log(bubbleSort(arr))
function bubbleSort3(arr3) {var low = 0;var high= arr.length-1; //設置變量的初始值var tmp,j;console.time('2.改進后冒泡排序耗時');while (low < high) {for (j= low; j< high; ++j) //正向冒泡,找到最大者if (arr[j]> arr[j+1]) {tmp = arr[j]; arr[j]=arr[j+1];arr[j+1]=tmp;}--high; //修改high值, 前移一位for (j=high; j>low; --j) //反向冒泡,找到最小者if (arr[j]<arr[j-1]) {tmp = arr[j]; arr[j]=arr[j-1];arr[j-1]=tmp;}++low; //修改low值,后移一位}console.timeEnd('2.改進后冒泡排序耗時');return arr3;
}
var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
console.log(bubbleSort3(arr));//[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]
循序漸進的過程:
冒泡排序2次改進
JavaScript算法(含冒泡排序3次改進)
1.2. 選擇排序
思想:
- len-1 輪排序
- 每輪排序,選出最小的數,放在最前的位置
1.3. 插入排序
思想: 打牌
1.4. 希爾排序
- 確定一個增量
-
1.5. 快速排序
- 首先設定一個分界值,通過該分界值將數組分成左右兩部分。
- 將大于或等于分界值的數據集中到數組右邊,小于分界值的數據集中到數組的左邊。
- 然后,左邊和右邊的數據可以獨立排序。對于左側的數組數據,又可以取一個分界值,將該部分數據分成左右兩部分,同樣在左邊放置較小值,右邊放置較大值。右側的數組數據也可以做類似處理。
- 重復上述過程,可以看出,這是一個遞歸定義。通過遞歸將左側部分排好序后,再遞歸排好右側部分的順序。當左、右兩個部分各數據排序完成后,整個數組的排序也就完成了。
1.6. 隨機排序
- Math.random()得到的是0~1之間的隨機數;
- sort()可以調用一個函數做為參數,這個函數接收(a,b)兩個參數,
① a<b返回-1 (小于0的值)
② a=b返回0,
③ a>b返回1(大于0的值),
以這樣的規則返回正負數的函數,排序結果為升序;
arr.sort((a, b) => a - b) // 升序排序
arr.sort((a, b) => b - a) // 降序排序
- 讓Math.random()隨機出來的數與0.5做為一個比較,為正為負的幾率各一半
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
arr.sort(function() {return Math.random() - 0.5;
})
console.log(arr);
2. 函數柯里化
詳解JS函數柯里化
3. 技巧方法
- 字符串倒序
str.split('').reverse().join('')
- 斐波那契
function getFibo(i) {if (i == 0 || i == 1) {return 1} else {return arguments.callee(i-1) + arguments.callee(i-2)}
}
- 數組最值
Math.max(...arr)
Math.min(...arr)