冒泡排序: 随便从数组中拿一位数和后一位数比较,若是是想从小排到大排序,那么就把小的那一位放到前面,大的放到后面,简单来讲就是交换他们的位置,如此反复的交换位置就能够获得排序的效果。面试
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!!!!复制代码