快速学习经典排序算法(javaScript实现)

你能学到都什么?

①时间复杂度 ②空间复杂度 ③什么是算法稳定性 ④五种经典算法的思路及代码实现

学习排序算法(js代码实现)

排序算法在工作和学习中很常见,今天主要js实现冒泡排序,插入排序,选择排序,归并排序,快速排序。
注意:
① 空间复杂度一般指额外空间复杂度
② 算法稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,则称这个算法稳定。

冒泡排序

平均时间复杂度:O(n2) 空间复杂度O(1) 很稳定

function bubbleSort(arr){
    
    
for (let i = 0; i < arr.length; i++) {
    
    
    for (let j = arr.length; j > i; j--) {
    
    
        
        if(arr[j]<arr[j-1]){
    
    
            //两值互换
            arr[j]=arr[j]^arr[j-1]
            arr[j-1]=arr[j-1]^arr[j]
            arr[j]=arr[j]^arr[j-1]
        }
    }
}
return arr
}

自我感觉:理解简单,时间复杂度较高

插入排序

平均时间复杂度:O(n2) 空间复杂度O(1) 很稳定

function insertSort(arr){
    
    
for (let index = 1; i < arr.length; index++) {
    
    
    for (let i = index-1; i >=0&&arr[i]>arr[i+1]; i--) {
    
    
        arr[i] = arr[i]^arr[j]
        arr[j] = arr[i]^arr[j]
        arr[i] = arr[i]^arr[j]
    }
}
return arr
}

自我感觉:理解简单,复杂度较高,可以参考扑克牌整理牌过程

选择排序

平均时间复杂度:O(n2) 空间复杂度O(1) 不稳定

function selectSort(arr){
    
    
    for (let  i= 0; i < arr.length-1; i++) {
    
    
        let min = i
        for(let j = i+1;j<arr.length;j++){
    
    
            if(arr[j]<arr[min]){
    
     
                min = j
            }
        }
        arr[i] = arr[i]^arr[min]
        arr[min]= arr[min]^arr[i]
        arr[i] = arr[i]^arr[min]
        
    }
    return arr
}

自我感觉:每次完成一个循环,都会找到一个相对最小值

归并排序

平均时间复杂度:O(nlog2n) 空间复杂度O(n) 很稳定

function mergeSort(arr,l,r){
    
    
  if(l == r){
    
    
      return [arr[l]]
  }
  let mid = parseInt((l+r)/2)
  let arrleft = mergeSort(arr,l,mid)
  let arrRight = mergeSort(arr,mid+1,r)
  return merge(arrleft,arrRight)
}
function merge(arrleft,arrRight){
    
    
let i = 0
let j = 0
let temp =[]
while(i<arrleft.length||j<arrRight.length){
    
    
if(arrleft[i]<arrRight[j]||j>=arrRight.length){
    
    
    temp.push(arrleft[i])
    i++
}else if(arrleft[i]>=arrRight[j]||i>=arrleft.length){
    
    
    temp.push(arrRight[j])
    j++
}
}
return temp
}

自我感觉:先将数组不断分割,分割到最小单位,然后再合并(合并的时候排序)。采用"双指针"通过比较加入到新的数组中。

快速排序

平均时间复杂度:O(nlog2n) 空间复杂度O(nlog2n) 不稳定

function quickSort(arr,l,r){
    
    
    if(l==r){
    
    
        return;
    }
    let i = l
    let j = r
    let key = i
    while(i<j){
    
    
        while(i<j&&arr[i]<arr[key]){
    
    
        i++
        }
        while(i<j&&arr[j]>=arr[key]){
    
    
        j--
        }
        if(i!=j){
    
    
            arr[i] = arr[i]^arr[j]
            arr[j] = arr[j]^arr[i]
            arr[i] = arr[i]^arr[j]
        i++;
        j--
        }
    }
quickSort(arr,l,i)
quickSort(arr,j+1,r)
}
//简单测试
let arr1 = [8,2,6,3,4,7,9]
quickSort(arr1,0,arr1.length-1)
console.log(arr1)

自我感觉:快速排序是以数组的某个值为基数,进行排序,然后进行不断递归到最小单位就可以了,顺序就自然出来了

代码下载地址

一定要自己去实现一下

感谢

如果感觉对您的学习工作有帮助,请将它分享给需要的人,或者点赞鼓励一下,感谢支持
你可以加个收藏,我还会不断更新。。。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/XINpxXIN/article/details/104541770