桶排序

205 阅读1分钟

思路:

在最大值和最小值之间分N个桶,每个桶代表其中的一段区间。

【0-100】,分4桶,桶1【0,25】,桶2【26-50】。。。。

【0-100】,每个桶25个元素,分4桶

「推导」

[5,4,3,2,1,6]

分成3个桶

[[1,2],[3,4],[5,6]]

「代码」

function sortArray(nums: number[]): number[] {
    let len = nums.length;
    if ((len <= 1)) {
      return nums;
    }

    let min:number = nums[0]
    let max:number = nums[0]
    for(let i = 1;i<len;i++){
        if(nums[i] < min){
            min = nums[i]
        }
        if(nums[i] > max){
            max = nums[i]
        }
    }

    //这是桶,每个下标代表nums的某一段区间
    const buckets:(number[]|undefined)[] = []
    //每个桶的元素
    let size:number = 3
    //将nums分成多少个桶
    let count:number = Math.floor(((max-min)/size) + 1)

    for(let i = 0;i<len;i++){
        //判断放那个桶
        const index = ~~((nums[i]-min)/size)//
        if(buckets[index]){
            buckets[index]?.push(nums[i])
        }else{
            buckets[index] = [nums[i]]
        }
    }
    let arr:number[] = []
  for(let i = 0;i<count;i++){
    //这里开始对桶类元素排序,图省事我直接用sort了
    if(buckets[i]){
        buckets[i] = buckets[i]?.sort((a,b) => {
            return a - b
        })
    //桶类元素合并
      arr = arr.concat((buckets[i]) as number[])
    }
  }
    return arr
  }
  

时间:O(n+K) 空间:O(n) 稳定性:看桶类算法