思路:
在最大值和最小值之间分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) 稳定性:看桶类算法