目录
1、sort()方法
2、冒泡排序
3、插入排序
比如有这样一个数组
var arr=[ 1 , 3 , 4 , 10 , 5 , 8 , 9 , 2 , 21]
用以下几种方法来对它进行排序
1、sort方法
sort()是js中可以直接用来排序的方法,默认情况下,是按升序排列数组,但sort()通常是按比较字符串(ASCII)的方式来进行排序,如:
arr.sort();
console.log(arr) //[1,10,2,21,3,4,5,8,9]
//注:sort()会改变原数组
得到的顺序看似逻辑没有问题,但绝对不是比较一个数值数组的最佳方式,因此,sort()方法通常需要接收一个函数来作为比较的参考,如下:
//定义一个比较函数
function compare(v1,v2){
if(v1<v2){
return -1;
}
else if(v1>v2){
return 1;
}
else{
return 0
}
}
arr.sort(compare)
console.log(arr) //[1,2,3,4,5,8,9,10,21]
简单来说就是如果v1应该位于v2之前,返回一个负数;v1应该位于v2之后,返回正数;相等返回0;
其实想要得到上面这个结果,只需要用v1-v2即可得到正、负数以及0,如下简写:
function compare(v1,v2){
return v1-v2;
}
arr.sort(compare)
console.log(arr) //[1,2,3,4,5,8,9,10,21]
如果想要降序排列,也只需要将v2-v1即可,如下:
function compare(v1,v2){
return v2-v1;
}
arr.sort(compare)
console.log(arr) //[21,10,9,8,5,4,3,2,1]
也可以使用reverse()来将升序的数组直接进行翻转
arr.reverse()
注意reverse()是翻转方法,实际是不能用来排序的,他只能将一个数组直接翻转过来,如下所示,得到的结果与排序一点关系都没有。
var arr1=[1,3,6,10,2]
arr1.reverse();
console.log(arr1) // [2,10,6,3,1]
2、冒泡排序
冒泡排序也是相对比较简单,比较常用的一种排序方式,它的实现原理是依次比较相邻的两个数,根据顺序交换元素,直至没有可交换的,则排序结束。
function arrSort(arr){
for(var i=0;i<arr.length-1;i++){ //趟数
for(var j=0;j<arr.length-1-i;j++){ //i趟比较几次
if(arr[j]>arr[j+1]){
//交换位置
var temp=arr[j]; //设置一个暂存区
arr[j]=arr[j+1];
arr[j+1]=temp
}
}
}
return arr
}
console.log(arrSort(arr)) //[1,2,3,4,5,8,9,10,21]
当然如果需要降序的话,将条件改为 arr[j]<arr[j+1]
即可
3、插入排序
插入排序也是比较简单、易懂的排序。有两层循环,外层循环的是循环除了第一个值以外的数据,内层循环的是在已排好序列的基础上,从后往前查找需要插入的位置。
通常第一轮循环,会将第一个数值作为已排好的序列,所以从第二个值开始,依次向前比较,如果比前一个值小,那么交换位置,也就是插入到它前面。请看例子:
function sortArr(arr){
var key;
var j;
for(var i=1;i<arr.length;i++){
key=arr[i] //设定key值
j=i-1; //已排好序列的最后一个位置
while(j>=0 && key<arr[j]){
//当key小于前一个数值时,交换位置
arr[j+1]=arr[j];
arr[j]=key;
j--;
//继续和前一个比较,直到前面没有值
}
}
return arr
}
我们来看一下实现过程:
以这个数组为例:arr=[ 1 , 3 , 2 , 10 , 5 , 8 ]
第一轮(i=1):
key=3;已排好的序列为 [ 1 ];
3和1进行比较,不符合条件,不交换位置,不进入内层循环。此时序列为[1,3,2,10,5,8]
第二轮(i=2):
key=2;已排好的序列为[1, 3 ];
2和3进行比较,符合条件,进入内层循环,2和3交换位置,为[1,2,3]
j--,2和1进行比较,不符合条件,退出内层循环。此时序列为[1,2,3,10,5,8]
第三轮(i=3):
key=10,已排好的序列为[1,2,3];
10和3进行比较,不符合条件,不进入内层循环。
第4轮 (i=4):
以此类推...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。