一、分
运用递归,不断分割
二、治
1、创建一个临时数组用来存放
2、比较左右数组中的第一个数,若左边小,就把左边第一个数放进临时数组,反之把右边第一个数放进临时数组
3、处理左边数组剩余数据,处理右边数组剩余数据
//slice:是截取用的[start,end)
//splice:是做删除 插入 替换用的(start,end,insertElement...);
var devide_sort = function(nums) {
//递归停止条件
if (nums.length < 2) {
return nums;
}
//将数组用递归切分
var mid = nums.length / 2;
//创建每个递归层的left数组
var left = nums.slice(0, mid); //splice,开区间[0,mid),返回被切了的数组,nums也会改变
//创建每个递归层的right数组
var right = nums.slice(mid, nums.length);
return merge_sort(devide_sort(left), devide_sort(right));
};
var merge_sort = function(left, right) {
//这里才是重点
//排序
var temp_Array = [];
//当左数组与右数组长度都大于零
while (left.length && right.length) {
//比较左右数组第一个元素的大小---永远都是第一个元素,因为前面的都被shift掉了
if (left[0] > right[0]) {
temp_Array.push(right.shift());
} else {
temp_Array.push(left.shift());
}
}
//处理左边剩余数组
while (left.length) {
temp_Array.push(left.shift());
}
//处理右边剩余数组
while (right.length) {
temp_Array.push(right.shift());
}
return temp_Array;
};
console.log(devide_sort([6, 3, 5, 4, -1, -8, -4, 2]));
知识点:
//slice:是截取用的[start,end) ,注意: slice()方法不会改变原始数组。slice() 方法可提取字符串的某个部分,并以新的字符串返回被提取的部分。
//splice:是做删除 插入 替换用的(start,end,insertElement…);这种方法会改变原始数组。返回值:如果从 arrayObject 中删除了元素,则返回的是含有被删除的元素的数组。也就是原来的数组也改变了,是删除完了剩下的元素,返回值是被删除的元素
slice[start,end):
参数:
start:开始位置的索引
end:结束位置的索引(但不包含该索引位置的元素)
例如:
var arr=[‘a’,’b’,’c’,’d’]
var newArr=arr.slice(0,3); //不包含索引值为3对应的元素
console.log(newArr); //输出的是[‘a’,’b’,’c’,’]
var newArr2=arr.slice(0); //如果没有第二个参数,截取到的是最后一个元素
console.log(newArr2); //输出的是[‘a’,’b’,’c’,’d’]
splice具有删除,插入,替换的功能
1:删除的功能
splice(index,count)
参数:
index:开始位置的索引
count:要删除元素的个数
返回:返回的是包含被删除元素的数组对象
//删除功能
Var newArr=arr.splice(1,2); //会把b,c两个元素给删除掉
console.log(arr); //[‘a’,’d’]
console.log(newArr); //返回[‘b’,’c’]
- 插入功能
splice(index,0,插入的项)
参数
index:插入元素的索引值
例如:
//插入功能
var arr=[‘a’,’b’,’c’,’d’]
var newArr=arr.splice(2,0,’张三’)
console.log(arr) //输出=[‘a’,’b’,’张三’,’c’,’d’]
3:替换功能
splice(index,num,value)
index:开始的索引位置
num:删除项的数(如果num为0,就是插入功能)
value:插入的值
返回:返回的是包含被删除的元素的数组对象
var arr=[‘a’,’b’,’c’,’d’]
var newArr=arr.splice(2,2,’张三’,’李四’)
console.log(arr) //输出=[‘a’,’b’,’张三’,’李四’]
console.log(newArr) //输入[‘c’,’d’]