基数排序

128 阅读1分钟

˙正整数排序

思路

按位比较,位数作为新数组下标

「推导」

[012354123]
最大值位123,三位,将所有元素写成三位
[000012123003054]
排个位
[000],undfined,[012],[123003],054
排十位
[000003],[012],[123],und,und[054],
排百位
[000003012054],[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)

稳定