数组排序

149 阅读2分钟

快速排序

思想:

对一个数组找到一个中间数,左右分两组,创建两个空数组,遍历左右数组,如果比中间数大放在右边数组,比中间数小就放在左边数组,采用递归,最后将两个数组和中间作比较的数合成一个新的数组 代码示例

let quickSort = (numbers) =>{
    if(numbers.length <= 1){return numbers}
    let pivot = numbers.splice(Math.floor(numbers.length / 2),1)[0]
    let left = []
    let right = []
    for (let i = 0;i<numbers.length;i++){
        if(numbers[i]<pivot){
            left.push(numbers[i])
        }else{right.push(numbers[i])}
    }
    return quickSort(left).concat([pivot], quickSort(right))
}

归并排序

思想:

和快速排序相似,只是说没有找中间量做对比,将原数组分成两个数组,从两个数组里找到第一个数作比较,小的放在第一个,递归到最后一个,最后返回排序完成的数组

代码示例

let mergeSort = (numbers) =>{
    if (numbers.length<=1){return numbers}
    let left = numbers.slice(0,Math.floor(numbers.length/2))
    let right = numbers.slice(Math.floor(numbers.length/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))
}

计数排序

思想:

创建一个哈希表,和一个新数组,遍历一遍原数组,放进哈希表里,遍历哈希表,从小到大放进新数组里,返回新数组

代码示例:

let countSort = (numbers) =>{
    let hashTable ={},max =0,result = []
    for(let i =0 ;i<numbers.length;i++){
        if(!(numbers[i] in hashTable)){
            hashTable[numbers[i]] = 1
        }else(hashTable[numbers[i]] += 1)
    }
    if (numbers[i]>max){max =numbers[i]}
    for(let j = 1;j<max;j++){
        if(j in hashTable){
            for(let i =0 ;i<hashTable[j];j++){
                result.push(j)
            }
        }
    }
    return result
}

冒泡排序

思想:

遍历数组,找到第一个和后一位对比,如果比他大就交换位置,如果比它小就保持不动。后一位重复原先行为,直至数组排序完成

代码示例:

let bubbleSort = (numbers) =>{
for(let j = 0 ; j <numbers.length-1;j++){
    for(let i =1;i<numbers.length-1-j;i++){
        if(numebrs[i] > numbers[i+1]){
            let item = numbers[i]
            numbers[i] = numbers[i=1]
            numbers[i+1] = item
        }
    }
  }
  return nubmers
}

总结

时间复杂度

  • 快速排序 (n*log2n)
  • 归并排序(n*log2n)
  • 计数排序(n*max)
  • 冒泡排序(n^2)