四种排序算法

116 阅读2分钟

1. 选择排序

时间复杂度:O(n^2)

  • 递归写法
let min = (numbers)=>{
    if(numbers.length>2){
        return min([numbers[0],min(numbers.slice(1))])
    }else{
        return Math.min.apply(null,numbers)
    }
} //找到数组中最小的数

let minIndex = (numbers)=>numbers.indexOf(min(numbers))//得到最小的数的index

let sort = (numbers) =>{
    if(numbers.length > 2){
        let index = minIndex(numbers)
        let min = numbers[index]
        numbers.splice(index,1)
        return [min].concat(sort(numbers))
    }else{
        return numbers[0]<numbers[1]?numbers:numbers.reverse()
    }
}//选择排序的实现!
  • 循环写法
let swap = (array,i,j) => {
    let temp = array[i] //将作比较的两个数的其中一个给第三者
    array[i] = array [j]
    array[j] = temp //两个数位置交换
}
let minIndex = (numbers) =>{
    let index = 0
    for(let i = 1; i < numbers.length; i++){
        if(numbers[i] < numbers[index]){
            index = i
        }
    }
    return index
} //找到最小数的index
let sort = (numbers) => {
    for(let i = 0; i < numbers.length - 1; i++){
        let index = minIndex(numbers.slice(i)) + i
        if(index !== i){
            swap(numbers,index,i)
        }
    }
    return numbers
}

2. 快速排序

时间复杂度:O(log2 n)

let quickSort = arr => {
    if (arr.length <= 1) { return arr; } //数组为空或者只有一位的情况
    let pivotIndex = Math.floor(arr.length / 2); //取数组中间某个数的index
    let pivot = arr.splice(pivotIndex, 1)[0]; //根据index得到中间的数
    let left = [];
    let right = [];  
    for (let i = 0; i < arr.length; i++){
        if (arr[i] < pivot) { 
        left.push(arr[i]) //小于中间数的放左边
        } else { 
        right.push(arr[i]) //大于的放右边
        }
    }
    return quickSort(left).concat([pivot], quickSort(right) ) //将得到排好序的数组连接起来
}

3. 归并排序

时间复杂度:O(log2 n)

let mergeSort = arr =>{
    let k = arr.length
    if(k === 1){return arr}
    let left = arr.slice(0, Math.floor(k/2))
    let right = arr.slice(Math.floor(k/2))
    //将数组分为左右两部分,最终会被拆到数组内只剩一个数,在进行比较
    return merge(mergeSort(left), mergeSort(right))
}
let merge = (a, b) => {
    if(a.length === 0) return b
    if(b.length === 0) return a
    return a[0] > b[0] ?[b[0]].concat(merge(a, b.slice(1))) :[a[0]].concat(merge(a.slice(1), b))
}

4. 计数排序

时间复杂度:O(n + max)

let countSort = arr =>{
    let hashTable = {}, max = 0, result = [] //初始化哈希表,最大值
    for(let i = 0; i < arr.length; i++){ 
        if(!(arr[i] in hashTable)){
            hashTable[arr[i]] = 1
        }else{
            hashTable[arr[i]] += 1
        }
        if(arr[i] > max) {max = arr[i]} //最大值一直给max
    }
    for(let j = 0; j <= max; j++){ // 设置最小值为0,遍历哈希表
        if(j in hashTable){
            for(let i = 0; i < hashTable[j]; i++){ //i < hashTabl[j] 一个数多次出现,都要放进数组里 
                result.push(j)//如果数在表里面,则将数放进创建的数组里面
            }
        }
    }
    return result
}