JavaScript数组排序方式有很多,最简单的排序方式就是使用Math.sort((a,b)=>a-b)直接搞定,但有时只会一种方法却显得没有逼格,学习多几种方法多几分自信,毕竟技多不压身嘛。
数组位置交换方法
数组排序就是比较各数组元素大小,然后交换相对应的位置,来个交换数组位置的函数。
// 交换数组位置
const swap=(array,a,b)=>[array[a],array[b]]=[array[b],array[a]] //array为数组,a、b为数组下标
冒泡排序
冒泡排序即取数组两个相邻的元素依次比较大小,直到没有相邻元素需要交换。
let arr = [5,3,10,-5,6,7,2];
// 冒泡排序
const bubbleSort=(array)=>{
if(!Array.isArray(array)){
console.error('传入array非数组')
return '传入array'+array
}
for(let i=0;i<array.length-1;i++){
for(let j=0;j<array.length-1;j++){
if(array[j]>array[j+1]){
//交换数组元素位置
swap(array,j,j+1)
}
}
}
return array
}
// console.log('bubbleSort',bubbleSort(arr)) //[-5, 2, 3, 5, 6, 7, 10]
快速排序
快速排序是通过多次比较和交换来实现排序,在一个数组中取一个数作为比较的基数,根据这个基数将数组分为两部分,然后继续递归排序这两部分,最终实现所有数组元素排序。
let arr = [5,3,10,-5,6,7,2];
// 快速排序
const quickSort=(array)=>{
if(!Array.isArray(array)){
console.error('传入array非数组')
return '传入array'+array
}
if(array.length<=1)return array
let leftArr=[];
let rightArr=[];
// 获取中间基数的下标与值
//这里我是取数组的中间位置
let middleIndex=Math.floor(array.length/2);
let middleValue=array.splice(middleIndex,1)[0];
for(let i=0;i<array.length;i++){
array[i]<middleValue?leftArr.push(array[i]):rightArr.push(array[i]);
}
//分别递归分开的两部分数组并与中间值拼接
return quickSort(leftArr).concat([middleValue],quickSort(rightArr))
}
// console.log('quickSort',quickSort(arr))//[-5, 2, 3, 5, 6, 7, 10]
选择排序
选择排序是每一次从待排序的元素中选出最小(最大)的元素放置序列的开头,然后再从未排序的数组元素中选取元素放置已排序的末尾,直到待排序的数组元素拍完。
let arr = [5,3,10,-5,6,7,2];
// 选择排序
const selectSort=(array)=>{
if(!Array.isArray(array)){
console.error('传入array非数组')
return '传入array'+array
}
for(let i=0;i<array.length;i++){
let currentIndex=i;
for(let j=i+1;j<array.length;j++){
// console.log(array[j],array[currentIndex])
if(array[j]<array[currentIndex]){
// console.log(array[j],array[currentIndex])
currentIndex=j;
}
}
if(currentIndex!==i){
//交换数组元素位置
swap(array,i,currentIndex);
// console.log(array)
}
}
return array
}
// console.log('selectSort',selectSort(arr))//[-5, 2, 3, 5, 6, 7, 10]
结尾
呼~,这就是我所理解的几种数组排序方式,不是很难,就怕想不明白。