冒泡排序: 隨便從數組中拿一位數和後一位數比較,若是是想從小排到大排序,那麼就把小的那一位放到前面,大的放到後面,簡單來講就是交換他們的位置,如此反覆的交換位置就能夠獲得排序的效果。面試
var arr = [3,1,4,2,5,21,6,15,63];
function sortA(arr){
for(var i=0;i<arr.length-1;i++){
for(var j=i+1;j<arr.length;j++){
//獲取第一個值和後一個值比較
var cur = arr[i];
if(cur>arr[j]){
// 由於須要交換值,因此會把後一個值替換,咱們要先保存下來
var index = arr[j];
// 交換值
arr[j] = cur;
arr[i] = index;
}
}
}
return arr;
}
//由於一次循環只能交換一個最大的值,因此須要再套一層for循環。
複製代碼
快速排序:從數組的中間那一個值,而後經過這個值挨個和數組裏面的值進行比較,若是大於的放一邊,小於的放一邊,而後把這些合併,再進行比較,如此反覆便可數組
var arr = [3, 1, 4, 2, 5, 21, 6, 15, 63];
function sortA(arr) {
// 若是隻有一位,就沒有必要比較
if (arr.length <= 1) {
return arr;
}
// 獲取中間值的索引
var len = Math.floor(arr.length / 2);
// 截取中間值
var cur = arr.splice(len, 1);
console.log('middle data' + cur);
// 小於中間值放這裏面
var left = [];
// 大於的放着裏面
var right = [];
for (var i = 0; i < arr.length; i++) {
// 判斷是否大於
if (cur > arr[i]) {
left.push(arr[i]);
console.log('left: '+ left);
} else {
right.push(arr[i]);
console.log('right: ' + right);
}
}
// 經過遞歸,上一輪比較好的數組合並,而且再次進行比較。
return sortA(left).concat(cur, sortA(right));
}
console.log(sortA(arr));
複製代碼
看一下控制檯的打印就能夠看清楚了
合併的順序是 2+3-> 1+2+3 -> 1+2 +3+4
21+63 -> 6 + 15 + 21 + 36
最後將left 最外層cur right 合併 1+2+3+4 +5+ 6+15+21+63
複製代碼
歸併排序。二叉樹,是由於歸併排序一樣能夠用構成一棵二叉樹來解釋,只不過快排的複雜度花在了成樹(二叉搜索樹)上(從上往下),而歸併排序的複雜度花在了歸併上(從下往上)。bash
function mergeSort(arr) {
// 設置終止的條件,
if (arr.length < 2) {
return arr;
}
//設立中間值
var middle = parseInt(arr.length / 2);
//第1個和middle個之間爲左子列
var left = arr.slice(0, middle);
console.log('left: ' + left);
//第middle+1到最後爲右子列
var right = arr.slice(middle);
console.log('right: ' + right);
if (left == "undefined" && right == "undefined") {
return false;
}
return merge(mergeSort(left), mergeSort(right));
}
複製代碼
function merge(left, right) {
var result = [];
while (left.length && right.length) {
if (left[0] <= right[0]) {
//把left的左子樹推出一個,而後push進result數組裏
result.push(left.shift());
} else {
//把right的右子樹推出一個,而後push進result數組裏
result.push(right.shift());
}
}
//通過上面一次循環,只能左子列或右子列一個不爲空,或者都爲空
while (left.length) {
result.push(left.shift());
}
while (right.length) {
result.push(right.shift());
}
console.log('result:' + result);
return result;
}
複製代碼
// 測試數據
var nums = [6, 10, 1, 9, 4, 8, 2, 7, 3, 5];
console.log(mergeSort(nums));
複製代碼
首先left 6,10,1,9,4 right:8,2,7,3,5
分到最底層時開始比:9,4 --> 4,9 而後 left 1 right 9,4 排成 1,4,9 而後 left 6,10 right 1,4,9 排成 1,4,6,9,十、、、、
而後最後的排 而後 over!!!!複製代碼