js中的三种常见的数组排序方法有,js原生存在的排序函数sort(),冒泡排序,选择排序
一、sort()函数:
不给sort()传参
var numArr = [45,63,24,16,79];
console.log(numArr.sort()); // [16, 24, 45, 63, 79]
console.log(numArr); // [16, 24, 45, 63, 79]
会按照升序的方式对原数组进行排序,并将排序结果返回。
我们再多试几个例子来验证函数的准确性
var numArr = [12,42,321,152];
console.log(numArr.sort()); // [12, 152, 321, 42]
console.log(numArr); // [12, 152, 321, 42]
这个时候就会发现结果好像和我们想象的不一样,为什么42成了最大的了。事实上,sort()是按照字符编码的顺序进行排序,默认比较的时候会将数组的元素都转换成字符串,而字符串的比价规则是:诸位比较,得到结果就停止。所以我们才会得到上面这个例子的"不正确"排序。
在给sort()传参后:
sort传入的参数必须是函数;传一个回调函数
var numArr = [12,42,321,152];
console.log(numArr.sort(function(z,x){
return z-x;
})); // [12, 42, 152, 321]
这里我们看到返回的结果是按照正常的数字进行排序,实际上这种用法的规则是第一个参数z减第二个参数x为升序排序,如果是第二个参数x减去第一个参数z,就会进行降序的排序。
二、冒泡排序
冒泡排序的思路:重复遍历数组中的元素,依次比较两个相邻的元素,如果前一个元素大于后一个元素,就依靠第三个变量将它们换过来,直到所有元素遍历完。
var arr = [6,3,2,4,1];
for(var i=0;i<arr.length-1;i++){ // 大循环,确定执行几轮(确定行)
for(var j=0;j<arr.length-1-i;j++){ // 小循环,每轮执行多少次(每行的列)
if(arr[j] > arr[j+1]){ // 开始判断了,将当前位置和后一位作比较,大的放后面
var ls = arr[j]; // 交换
arr[j] = arr[j+1];
arr[j+1] = ls;
}
}
}
console.log(arr);
三、选择排序
选择排序的思路:每次拿出一个数据,和其他所有数字相比较,得到大的或小的,与初始位置做交换
for(var i=0;i<arr.length-1;i++){
// 假设,将第一位保存出来,用来和后面所有作比较
// 假设,第一位是最小值
var iNow = arr[i];
// 立即将假设的最小值的位置,也存出来
var iNowIndex = i;
for(var j=i+1;j<arr.length;j++){
// 验证假设第一位是最小的正确性,不正确,就拿到比假设的值还小的值
if(iNow > arr[j]){
iNow = arr[j];
iNowIndex = j;
}
}
// 小循环执行结束后,iNow必然是最小值,此时此刻数组还没有发生变化
var ls = arr[i];
arr[i] = iNow;
// 上面是将最小值,放在第一位
// 第一位原本的数据,放在,原本最小值的位置,原本最小值得是哪呢?
arr[iNowIndex] = ls;
}
console.log(arr);