冒泡排序
原理:两两比较,大的往后排
function bubbleSort(arr){
let length=arr.length
for(let i = 0;i<length;i++){
for(let j = i+1;j<length;j++){
if(arr[i]>arr[j]){
[arr[i],arr[j]]=[arr[j],arr[i]]
}
}
}
return arr
}
复杂度分析:两轮循环,故复杂度为O(n²)
选择排序
原理:选择出未排序元素中最大的,并存放在未排序元素的尾部
function selectSort(arr){
let length= arr.length
for(let i = 0;i<length;i++){
//最大值的索引
let maxIndex=i
for(let j = i+1;j<length;j++){
if(arr[maxIndex]>arr[j]){
//当出现比max更大的值时,更新maxIndex
maxIndex=j
}
}
//交换最大值与最后一个未排序元素的位置
[arr[i],arr[maxIndex]]=[arr[maxIndex],arr[i]]
}
return arr
}
复杂度分析:两轮循环,故复杂度为O(n²)
插入排序
原理:每轮选出一个元素,将它放置在合适的位置上(即小值都在它的右边,大值都在它的左边)
function insertionSort(arr){
let length=arr.length
for(let i = 0; i<length;i++){
//保存当前值
let current = arr[i]
//上一个索引
let preIndex=i-1
//上一个值比当前值更小时交换顺序(大值左移)循环结束后最大值在最左边
while(preIndex>=0&&arr[preIndex]<current){
//小值右移,大值左移
arr[preIndex+1]=arr[preIndex]
//继续将该大值与左一位比较
preIndex--
}
//循环结束后current值丢失,赋值回来(相当于右移一位)
arr[preIndex+1]=current
}
return arr
}
复杂度分析:两轮循环,故复杂度为O(n²)
快速排序
原理:递归,小值放左边,大值放右边
function quickSort(arr){
if(arr.length<=1) return arr
let midIndex = Math.floor(arr.length/2)
let mid = arr.splice(midIndex,1)
let left=[]
let right=[]
for(let i = 0;i<arr.length;i++){
if(arr[i]<mid){
left.push(arr[i])
}else if (arr[i]>mid){
right.push(arr[i])
}
}
return quickSort(left).concat(mid,quickSort(right))
}
复杂度分析:O(nlogn)
归并排序
原理:分治
function mergeSort(arr){
if(arr.length<=1) return arr
let midIndex=Math.floor(arr.length/2)
let left=arr.slice(0,midIndex)
let right=arr.slice(midIndex)
return merge(mergeSort(left),mergeSort(right))
function merge(left,right){
let result = []
while(left.length&&right.length){
if(left[0]>right[0]){
result.push(right.shift())
}else{
result.push(left.shift())
}
}
while(left.length){
result.push(left.shift())
}
while(right.length){
result.push(right.shift())
}
return result
}
}
复杂度分析:O(nlogn)