js对数组进行排序的方法还是很多的,最近刚好又有一个实现表格排序功能的需求,本来是让后台做的,但由于各种因素推到了前端。嗯,正好回顾一下数组排序的多种实现方式~
1. JavaScript的sort()方法
sort()方法按照升序排列数组项,会调用每个数组项的toString()转型方法,然后比较得到的字符串。
compare()函数方法是一个比较函数,作为sort()方法的参数。
function compare(val1,val2){
return val1-val2;
};
array.sort(compare);
这种方法就不必多说了,简单粗暴,不用写排序的算法逻辑。
2. 冒泡排序
- (1)比较相邻的元素。如果第一个比第二个大,就交换他们两个位置。
- (2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
- (3)针对所有的元素重复以上的步骤,除了最后一个。
- (4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
function bubbleSort(arr) {
var len = arr.length;
for (var i = 0; i < len; i++) {
for (var j = 0; j < len - 1 - i; j++) {
if (arr[j] > arr[j+1]) { //相邻元素两两对比
var temp = arr[j+1]; //元素交换
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
return arr;
}
最简单的排序算法,但如果有追求的话还是不要使用了,因为有其他更好的实现方式。
3. 快速排序
递归思想,两边快速的排序,冒泡排序的改进
function quickSort(arr){
//如果数组长度小于等于1,则返回数组本身
if(arr.length<=1){
return arr;
}
//定义中间值的索引
var index = Math.floor(arr.length/2);
//取到中间值
var temp = arr.splice(index,1);
//定义左右部分数组
var left = [];
var right = [];
for(var i=0;i<arr.length;i++){
//如果元素比中间值小,那么放在左边,否则放右边
if(arr[i]<temp){
left.push(arr[i]);
}else{
right.push(arr[i]);
}
}
return quickSort(left).concat(temp,quickSort(right));
}
快速排序总结起来就是快,效率高,是处理大数据最快的排序算法之一。快速排序的内循环比大多数排序算法都要短小,这意味着它无论是在理论上还是在实际中都要更快。它的主要缺点是非常脆弱,在实现时要非常小心才能避免低劣的性能。
4.插入排序
function insertSort(arr){
//假设第0元素是有序序列,第1元素之后是无序的序列。从第1元素开始依次将无序序列的元素插入到有序序列中
for(var i=1; i<arr.length;i++){
if(arr[i]<arr[i-1]){
//取出无序序列中需要插入的第i个元素
var temp = arr[i];
//定义有序中的最后一个位置
var j = i-1;
arr[i] = arr[j];
//比较大小,找到插入的位置
while(j>=0&&temp<arr[j]){
arr[j+1] = arr[j];
j--;
};
//插入
arr[j+1] = temp;
}
}
return arr;
}
插入排序算是原理最容易理解的排序方式。
5. 选择排序
- (1)在未排序序列中找到最小(大)元素
- (2)并存放到排序序列的起始位置
- (3)然后,再从剩余未排序元素中继续寻找最小(大)元素
- (4)然后放到已排序序列的末尾。
- (5)以此类推
function selectSort(arr){
for(var i=0;i<arr.length;i++){
//设置当前范围最小值和索引
var min = arr[i];
var minIndex = i;
//在该范围选出最小值
for(var j=i+1;j<arr.length;j++){
if(min>arr[j]){
min = arr[j];
minIndex = j;
}
}
//将最小值插入,并将原来位置的最小值删除
arr.splice(i,0,min);
arr.splice(minIndex+1,1);
}
return arr;
}
在时间复杂度上表现最稳定的排序算法之一,用到它的时候,数据规模越小越好。
当然还有很多其他的算法,比如希尔排序、归并排序、堆排序等,有兴趣的可以自行研究~我这里也只是记录一下大家总结的常用的几种方式,排序具体用什么方式还是根据实际情况来定。