前言
在面试中围绕数组的考点是非常多的,对数组进行排序是重中之重的考点。接下来我就会对数组上的排序方法都进行一一介绍。
sort排序
js
let arr=[2,4,7,3,1,6,5]
console.log(arr.sort());//[1,2,3,4,5,6,7]
let arr=[2,4,7,3,1,6,5]
console.log(arr.sort((a, b) => {
return a - b
}));//[1,2,3,4,5,6,7]
let arr=[2,4,7,3,1,6,5]
console.log(arr.sort((a, b) => {
return b-a
}));//[7,6,5,4,3,2,1]
冒泡排序
冒泡排序核心是一个双层for循环
js
let arr=[2,4,7,3,1,6,5]
function bubble(arr){
for(var i=0;i<arr.length;i++){
for(var j=i+1;j<arr.length;j++){
if(arr[j]<arr[i]){
[arr[j],arr[i]]=[arr[i],arr[j]]
}
}
}
return arr
}
console.log(bubble(arr))
js
let arr=[2,4,7,3,1,6,5]
function bubble(arr){
for(var i=0;i<arr.length;i++){
let min= getMin(arr.slice(i))
let minIndex=arr.indexOf(min)
let flag=arr[i]
arr[i]=arr[minIndex]
arr[minIndex]=flag6
}
return arr
}
function getMin(arr){
let min=Infinity
for(var i=0;i<arr.length;i++){
if(arr[i]<min){
min=arr[i]
}
}
return min
}
js
function bubble(arr){
const len=arr.length
for(var i=0;i<len;i++){
let flag=false
for(var j=0;j<len-1-i;j++){
if(arr[j]>arr[j+1]){
[arr[j],arr[j+1]]=[arr[j+1],arr[j]]
flag=true
}
}
if(!flag) return arr
}
return arr
}
选择排序
找到数组中的最小值,把它放到最前面,不断的减缩要找的区间
js
let arr=[2,1,7,3,1,6,5]
function selectSort(arr){
const len=arr.length
let minIndex
//比较的是i,j这个区间的值
for(let i=0;i<len;i++){
minIndex=i
for(let j=i+1;j<len;j++){
if(arr[j]<arr[minIndex]){
minIndex=j
}
}
if(minIndex!==i){
[arr[i],arr[minIndex]]=[arr[minIndex],arr[i]]
}
}
}
插入排序
人为认定数组前一段(只有一个值也算)是有序的,将之后的值想办法放进已经有序的队伍当中
js
let arr=[2,1,7,3,4,1,6,5]
//[1,2,4,5] //3
function insertSort(arr){
const len=arr.length
let target
for(let i=1;i<len;i++){
target=arr[i]
let j=i
//遍历已经有序的值,找出target应该在的位置
while(arr[j-1]>target){
arr[j]=arr[j-1]
j--
}
arr[j]=target
}
}
快速排序
js
let arr=[2,4,7,3,5,1]
//[2,4,7] [3,5,1]
//4 [2] [7] 5[3] [1]
function quickSort(arr){
if(len<=1){
return arr
}
let middleIndex=Math.floor(arr.length/2)
let middle=arr.splice(middleIndex,1)[0]
let left=[]
let right=[]
const len=arr.length
for(let i=0;i<len;i++){
if(arr[i]<middle){
left.push(arr[i])
}else{
right.push(arr[i])
}
}
quickSort(left)
quickSort(right)
return [...quickSort(left),middle,...quickSort(right)]
}