js数组排序的⼏种⽅法
1、冒泡排序
以从⼩到⼤排序为例,冒泡排序的原理就是通过两层循环把数组中两两相邻的元素进⾏⽐较,是的⼤的元素放到后边,元素交换位置,从⽽⼀步步的交换元素的位置,使得最⼤的元素放到数组的末尾,这样内部的循环就进⾏了⼀轮,再根据外部的循环依次再把次⼤⼀点的元素放到数组的末尾,从⽽实现数组的逐步排序。代码如下:js数组方法总结
// 冒泡排序
var arr = [52,3,8,57,75,2,1];
for (var i = 0; i<arr.length; i++) {
for (var j =0;j<arr.length-i; j++) {
if(arr[j]>arr[j+1]){
var temp = arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
console.log(arr); //[1, 2, 3, 8, 52, 57, 75]
这⾥⾯通过⼀个变量temp实现相邻两个元素的位置替换,从⽽循环⼀轮使得最⼤的元素放到数组的末尾。
2、快速排序
快速排序是运⽤递归进⾏循环调⽤函数从⽽使得数组进⾏排序,代码如下:
// 快速排序
function quickSort(arr){
if(arr.length <= 1) return arr;
var Temp = Math.floor(arr.length/2);
var left = [],right = [];
var num = arr.splice(Temp,1)[0];
for(var i = 0;i < arr.length;i ++){
if(arr[i] < num){
left.push(arr[i]);
}
else {
right.push(arr[i]);
}
}
return quickSort(left).concat(num,quickSort(right));
}
var arr=[5,2,1,10,8,12,40,26,30];
console.log(quickSort(arr)); //[1, 2, 5, 8, 10, 12, 26, 30, 40]
其原理是⾸先创建⼀个递归函数,也就是函数的返回值还是函数本⾝,直到符合条件之后递归函数停⽌运⾏,像这个函数就是当时arr数组的长度⼩于等于1的时候该递归函数停⽌运⾏。基本原理就是先到数组中的中间那个元素的索引,如果数组长度是双数,那么就默认向上取值,也就是默认取数组长度/2+1位索引,在根据索引去的数组中间的值,然后创建两个空数组,⽤来放置⽐该元素⼩的值和⽐该元素⼤的值,在循环数组进⾏判断,如果数组的元素⼩于该中间位置元素的值,就放到左边数组,反之放到右边的数组,在函数中返回值设置为左边数组+中间的值+右边数组的拼接新数组,然后再根据递归对左边和右边的数组分别进⾏刚才的操作,直到数组的长度⼩于或者等于1,这时候停⽌,这时候调⽤函数之后,传⼊⼀个数组,就会⾃动返回数组排序之后的新数组,这就是快速排序的原理。
3、sort排序
// sort排序
var arr=[8,12,312,4,5];
function sortArray(n1,n2){
return n1-n2;
}
arr.sort(sortArray);
console.log(arr) //[4, 5, 8, 12, 312]
sort默认排序是按照字符来排序的,也就是ascii字母排序的,如果想要改变默认的排序⽅式,就要给他加⼀个⾃定义排序规则
function sortArray(n1,n2){
return n1-n2;
}
这个函数的意思是:若 n1⼩于 n2,即 n1-n2  ⼩于零,则返回⼀个⼩于零的值,数组将按照升序排列。
function sortArray(n1,n2){
return n2-n1;
}
这个函数的意思是:若 n1 ⼤于 n2, 即 n1 - n2 ⼤于零,则返回⼀个⼤于零的值,数组将按照降序排列。
4、选择排序
选择排序原理就是选择出数组中最⼤或者是最⼩的数放到最前⾯,然后在⼀次循环,选择次⼀级最⼤或者最⼩的数,从⽽得到想要的排序数组。
// 选择排序
var arr = [14, 82, 7, 1, 9, 0];
for(var i = 0; i < arr.length - 1; i++){
for(var j = i + 1; j < arr.length; j++){
if(arr[i] > arr[j]){
var tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
console.log(arr);//[0, 1, 7, 9, 14, 82]
选择排序也是运⽤中间变量的⽅法进⾏了数组元素位置的变换,从⽽使得最⼤或者最⼩的的元素⼀次从前向后排列。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。