˙正整数排序
思路
按位比较,位数作为新数组下标
「推导」
[0,12,3,54,123]
最大值位123,三位,将所有元素写成三位
[000,012,123,003,054]
排个位
[000],undfined,[012],[123,003],054
排十位
[000,003],[012],[123],und,und[054],
排百位
[000,003,012,054],[123]
function sortArray(nums: number[]): number[] {
let len = nums.length;
if (len <= 1) {
return nums;
}
let max: number = nums[0];
for (let i = 0; i < len; i++) {
if (nums[i] > max) {
max = nums[i];
}
}
//max位数
let maxDigit = 1;
while (max = Math.floor(max / 10)) {
maxDigit++;
}
let count: (number[] | undefined)[] = [];
let a = 10;
let b = 1;
for (let i = 0; i < maxDigit; i++) {
count = []
for (let j = 0; j < len; j++) {
//取位
let index = Math.floor((nums[j] % a) / b);
if (count[index]) {
(count[index] as number[]).push(nums[j]);
} else {
count[index] = [nums[j]];
}
}
//此时count已经按位排好了,开始生成一维数组,
let index = 0;
//遍历一维
for (let k = 0; k < count.length; k++) {
let val: number;
if (count[k]) {
//遍历第二维数组
while ((val = (count[k] as number[]).shift() as number) != null) {
nums[index++] = val;
}
}
}
a *= 10;
b *= 10;
}
return nums;
}
时间复杂度O(n^k) 受位数影响
空间复杂度O(n+k)
稳定