想要对一堆乱序的数组进行排序,我们可以采用冒泡排序和sort方法。冒泡排序是最基础的算法。
##冒泡排序
冒泡排序的原理:
1、比较相邻两元素,如果前一个比后一个大,则交换位置。
2、比较的第一轮,最大的元素排在了最后。
3、因为最大的元素在最后,所以最大的元素不参与下一轮的排序。
var arr = [2,3,1,0,4]
function Bubble_Sort(arr){
for(var i = 0, var len1 = arr.length; i < len1; i++){
for(var j = 0, len2 = arr.length - 1 - i; j < len2; j++){
if(arr[j] > arr[j+1]){
var temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
return arr
}
console.log(Bubble_Sort(arr)); //返回 [0,1,2,3,4]
冒泡排序总共比较n-1次
##sort()方法排序
sort() 方法用于对数组的元素进行排序。
w3c上的解释是:如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。
不太懂,我们来试试
var arr1 = ['c', 'a', 't', 's', 'g'];
var arr2 = [2, 4, 1, 3,21,20];
var arr3 = ['2', '4', '1', '3', '21', '20'];
console.log(arr1.sort()); // ["a", "c", "g", "s", "t"] 顺序正确
console.log(arr2.sort()); // [1, 2, 20, 21, 3, 4] 顺序错了
console.log(arr3.sort()); //["1", "2", "20", "21", "3", "4"] 顺序错了
这下懂了吧,sort没参数时时按字符编码进行排序的。
为了解决这个问题,我们自己封装一个顺序函数就好了,可以封装为升序排列和降序排列。
//升序排列,传入的value是用于比较的属性
function A_order (value){
return function(a,b){
var a = a[value]
var b = b[value]
return a - b
}
}
//升序排列,传入的value是用于比较的属性
function D_order (value){
return function(a,b){
var a = a[value]
var b = b[value]
return b - a
}
}
var arr3 = [
{name:'小明', age:18},
{name:'小红', age:15},
{name:'小白', age:10},
{name:'小蓝', age:20}
]
var arr4 = [
{name:'小明', age:18},
{name:'小红', age:15},
{name:'小白', age:10},
{name:'小蓝', age:20}
]
console.log(arr3.sort(A_order('age'))) //升序
console.log(arr4.sort(D_order('age'))) //降序
这里要注意,会直接改变数组原有的值,即在原数组上进行操作,改变原数组。