您的位置:首页 > 文旅 > 旅游 > 微信小程序制作平台哪个好_需要做网站的公司有哪些_seo手机端排名软件_什么是口碑营销

微信小程序制作平台哪个好_需要做网站的公司有哪些_seo手机端排名软件_什么是口碑营销

2024/10/6 15:54:36 来源:https://blog.csdn.net/bobostudio1995/article/details/142691338  浏览:    关键词:微信小程序制作平台哪个好_需要做网站的公司有哪些_seo手机端排名软件_什么是口碑营销
微信小程序制作平台哪个好_需要做网站的公司有哪些_seo手机端排名软件_什么是口碑营销

文章目录

    • 1. 基数排序简介
      • 1.1 基数排序定义
      • 1.2 基数排序特点
    • 2. 基数排序步骤过程拆解
      • 2.1 找出数组中的最大值
      • 2.2 从最低位开始,对每一位进行计数排序
      • 2.3 对某一位数进行计数排序
      • 2.4 将排序结果复制回原数组
    • 3. 基数排序的优化
      • 3.1 处理负数
      • 3.2 字符串排序
      • 案例代码和动态图
    • 4. 基数排序的优点
    • 5. 基数排序的缺点
    • 总结

在这里插入图片描述

【 已更新完 TypeScript 设计模式 专栏,感兴趣可以关注一下,一起学习交流🔥🔥🔥 】

1. 基数排序简介

1.1 基数排序定义

基数排序是一种非比较性的整数排序算法,它的核心思想是"按位排序"。想象你是一位军需官,需要整理一大批军需物资。这些物资的编号是由多位数字组成的,比如"23145"、"10234"等。你采用这样的策略:先按物资编号的最后一位数字排序,然后是倒数第二位,倒数第三位,以此类推,直到第一位。每一轮排序后,物资的顺序会越来越接近最终的正确顺序。这就像是你在一步步地将物资放到正确的仓库位置上,最终形成一个完美有序的军需仓库,这就是基数排序的基本思想。

用TypeScript代码表示一个简单的基数排序:

function radixSort(arr: number[]): number[] {if (arr.length <= 1) return arr;const max = Math.max(...arr);let exp = 1;const output = new Array(arr.length).fill(0);while (max / exp > 0) {const count = new Array(10).fill(0);for (let i = 0; i < arr.length; i++) {count[Math.floor(arr[i] / exp) % 10]++;}for (let i = 1; i < 10; i++) {count[i] += count[i - 1];}for (let i = arr.length - 1; i >= 0; i--) {output[count[Math.floor(arr[i] / exp) % 10] - 1] = arr[i];count[Math.floor(arr[i] / exp) % 10]--;}for (let i = 0; i < arr.length; i++) {arr[i] = output[i];}exp *= 10;}return arr;
}

1.2 基数排序特点

  1. 线性时间复杂度:基数排序的时间复杂度为O(d(n+k)),其中d是最大数的位数,n是数组长度,k是基数(通常为10)
  2. 非比较排序:基数排序不通过比较元素来排序,而是通过分配和收集的过程
  3. 稳定性:基数排序是稳定的排序算法
  4. 适用范围:适用于整数排序,特别是当整数的位数不是很大的时候

2. 基数排序步骤过程拆解

2.1 找出数组中的最大值

const max = Math.max(...arr);

这就像军需官找出所有军需物资编号中最大的那一个。这个最大编号将决定我们需要进行多少轮分类整理。

2.2 从最低位开始,对每一位进行计数排序

let exp = 1;
while (max / exp > 0) {// 进行一轮计数排序// ...exp *= 10;
}

这个过程就像军需官从军需物资编号的个位数开始,一位一位地进行排序,直到处理完最高位。

2.3 对某一位数进行计数排序

const count = new Array(10).fill(0);for (let i = 0; i < arr.length; i++) {count[Math.floor(arr[i] / exp) % 10]++;
}for (let i = 1; i < 10; i++) {count[i] += count[i - 1];
}for (let i = arr.length - 1; i >= 0; i--) {output[count[Math.floor(arr[i] / exp) % 10] - 1] = arr[i];count[Math.floor(arr[i] / exp) % 10]--;
}

这个步骤就像军需官为当前处理的位数准备了10个箱子(对应0-9这10个数字)。他先统计每个箱子里应该有多少件军需物资,然后从后往前,将每件物资放入对应的箱子。这样可以保证排序的稳定性,确保相同编号的物资保持原有的相对顺序。

2.4 将排序结果复制回原数组

for (let i = 0; i < arr.length; i++) {arr[i] = output[i];
}

这个步骤就像军需官完成了一轮排序后,将军需物资按新的顺序重新排列在仓库中。

3. 基数排序的优化

3.1 处理负数

function radixSortWithNegatives(arr: number[]): number[] {if (arr.length <= 1) return arr;const positives = arr.filter(num => num >= 0);const negatives = arr.filter(num => num < 0).map(num => -num);const sortedPositives = radixSort(positives);const sortedNegatives = radixSort(negatives).reverse().map(num => -num);return [...sortedNegatives, ...sortedPositives];
}

这个优化版本就像军需官遇到了一些特殊的负数编号的军需物资。他将军需物资分成两组:正数编号和负数编号。对负数编号取绝对值后进行排序,最后再将结果反转并恢复负号。

3.2 字符串排序

function radixSortStrings(arr: string[]): string[] {if (arr.length <= 1) return arr;const maxLength = Math.max(...arr.map(str => str.length));const buckets: string[][] = Array.from({ length: 256 }, () => []);for (let i = maxLength - 1; i >= 0; i--) {for (const str of arr) {const char = str[i] || '\0';buckets[char.charCodeAt(0)].push(str);}arr = buckets.flat();buckets.forEach(bucket => bucket.length = 0);}return arr;
}

这个优化版本就像军需官需要整理一批以字母编号的军需物资。他从最后一个字母开始,一直排序到第一个字母。每次排序时,他准备了256个箱子(对应ASCII字符),将军需物资按照当前处理的字母放入对应的箱子中。

案例代码和动态图

const numbers = [11, 45, 3, 40, 38, 24, 2, 19];
const sortedNumbers = radixSort(numbers);
console.log(sortedNumbers); // [2, 11, 19, 24, 38, 40, 45]const strings = ["apple", "banana", "cherry", "date", "elderberry"];
const sortedStrings = radixSortStrings(strings);
console.log(sortedStrings); // ["apple", "banana", "cherry", "date", "elderberry"]

在这里插入图片描述

4. 基数排序的优点

  1. 时间复杂度稳定:基数排序的时间复杂度是线性的,对于特定范围内的整数排序非常高效
  2. 稳定性:基数排序是稳定的排序算法,这在某些应用场景中非常重要
  3. 适合大数据量、取值范围较小的数据排序:当数据量很大但数字的位数不多时,基数排序的优势尤为明显

5. 基数排序的缺点

  1. 空间复杂度高:基数排序需要额外的存储空间来存储临时排序结果
  2. 适用范围有限:基数排序主要适用于整数或可以转化为整数的数据
  3. 不适合位数很多的大数排序:如果数字的位数很多,基数排序可能需要多次遍历,效率会降低

总结

基数排序告诉我们,面对一堆看似杂乱无章的数据,有时候从局部入手,逐步推进,最终也能达到全局有序的效果。这种"分而治之"的思想不仅在排序中有用,在我们日常解决复杂问题时也常常能派上用场。
基数排序的线性时间复杂度和稳定性,使它在特定场景下表现出色。特别是在处理大量整数且位数不多的数据时,基数排序常常能够展现出惊人的效率。然而,它对数据类型的限制和潜在的高空间复杂度,也提醒我们在选择算法时需要权衡利弊,考虑具体的应用场景。

喜欢的话就点个赞 ❤️,关注一下吧,有问题也欢迎讨论指教。感谢大家!!!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com