今天重新系统学习JavaScript时,温习了JS的数组排序方式,以此在这里做个整理:
(一)系统排序方法
reverse()
【功能】逆向排序
【格式】数组.reverse();
var arr = [10,20,30,40];
arr.reverse();
console.log(arr); //(4) [40, 30, 20, 10]
sort()
【功能】升序排序
【格式】 数组.sort();
var arr2=[5,4,3,2,1];
arr2.sort();
console.log(arr2);//(5) [1, 2, 3, 4, 5]
【注】 sort()默认按照字符串进行排序,见下例:
var arr22=[10,1,5,15];
arr22.sort();
console.log(arr22);//(5) [1,10,15,5]
而JS中,字符串排序是逐位按照ASCII码大小进行排序,例子中‘5’的ASCII码值最大,所以排到最后。
(二) 冒泡排序
冒泡排序是每个编程初学者都会立马学习到的排序方式,在此再次进行整理:
【原理】前后两个数两两进行比较,如果符合交换条件,则交换位置。直到所有数据排序完成.
例:对数组 【9,8,7,6,4,3】进行升序排序。
var arr3 = [9,8,7,6,4,3];
因为是升序排序,整个排序的核心思路就是通过两两比较,每一轮将整个数组中的最大数往后放,通过 (arr.length - 1) 轮即排序完成。(n个数,需要n-1轮,因为排序完前n-1个数,最后一个数自己目前所处的位置就是正确的位置)
而每经过一轮排序,需要进行两两比较的次数在不断减1(因为前几轮已经把某个极端大小的元素放到它所处的正确位置上了),即 除去已经排序完成的元素,该轮需要比较的次数为(数组个数 - 轮次数)
本例排序过程如下:
第一轮:
9,8,7,6,4,3
8,9,7,6,4,3
8,7,9,6,4,3
8,7,6,9,4,3
8,7,6,4,9,3
8,7,6,4,3,9
【注】:每一轮取出了一个最大的数放在正确的位置
第二轮:
8,7,6,4,3
7,8,6,4,3
7,6,8,4,3
7,6,4,8,3
7,6,4,3,8
第三轮:
7,6,4,3
6,7,4,3
6,4,7,3
6,4,3,7
第四轮:
6,4,3
4,6,3
4,3,6
第五轮
4,3
3,4
见代码:
for(var i = 1;i<arr3.length;i++){//需要比较的轮次
//每一轮比较的次数
for(var j = 0;j<arr3.length-i;j++){
//判断前后两个数是否符合交换条件
if(arr3[j]<arr3[j + 1]){
var tmp = arr3[j + 1];
arr3[j + 1] = arr3[j];
arr3[j] = tmp;
}
}
}
console.log(arr3);//3,4,6,7,8,9
在理解冒泡排序运行原理的基础上去写算法肯定是最清楚最清晰的,如果实在难以理解,也可以记住以下公式,用于冒泡排序的使用:
外层循环次数 = 被排序数组个数 - 1 ;
内层循环次数 = 被排序数组个数 - 外层循环次数;
(三) 选择排序
【原理】通过比较选出最小的数放在第一个位置上,然后在其余的数中选择次小数放在第二个位置,以此类推,直到所有的数成为有序序列。
选择排序相较于冒泡排序就好理解的多:通过不断的“以一敌多”的方式来完成数组的排序。所以,选择排序在很多大佬口中也被称作“擂台排序”或者“打擂台”
见代码:
var arr4 = [9,8,7,6,4,3];
for(var i = 0;i<arr4.length-1;i++){
for(var j = i+1;j<arr4.length;j++){
if(arr4[i]>arr4[j]){
var tmp = arr4[i];
arr4[i] = arr4[j];
arr4[j] = tmp;
}
}
}
console.log(arr4);//3,4,5,6,7,8,9
以上便是JS常用的排序算法,
【注】一般情况下,我们尽可能地要自己去编写排序算法,系统提供给我们的排序算法局限性大,容易出Bug,用的比较少。