当前位置: 首页 > news >正文

基数排序基础透彻理解

  • 基数排序不止于此,还有很多种方法,例如利用计数排序,哈希思想等
  • 下面我们以最简单的一种实现进行讲解:
  • #include
  • #include
  • #define Radix 10 //基数为0 ~ 9,总共10个数
  • #define MaxDigit 3 //最大为3位的整数,即最大为999
  • //提示:首先要明确操作的对象!!!
  • //定义结构体节点
  • typedef struct Node {
  • int data;
  • struct Node* next;
  • } Node;
  • /
  • 🎯 从数组创建链表的新函数
  • 避免手动输入,直接使用数组数据
    • */
    • //将数组创建为链表
    • Node* CreateListFromArray(int arr[], int n) {
    • //初始化首尾指针和temp指针
    • Node p = NULL, r = NULL, *temp;
    • //把数值存入链表中
    • for (int i = 0; i < n; i++) {
    • //temp是一个新创建的结点的地址
    • temp = (Node*)malloc(sizeof(Node));
    • temp->data = arr[i]; // 📋 直接从数组取值
    • temp->next = NULL; //初始化为NULL
    • //链表尾插法
    • if (p == NULL) {
    • //首尾都指向temp
    • p = r = temp;
    • } else {
    • r->next = temp; //把r后面连接上temp指向的结构体,操控了当前r指向的结构体内部的结构体指针的指向,先链接起节点
    • r = temp; //然后转向用r来操控下一个节点,把下一个节点的地址交给r了,r可以操控它,转换操作对象
    • }
    • }
    • return p;
    • }
    • //基数排序主函数,有链表之后就好操作了
    • void radixSort(Node *&p) {
    • //先声明了桶的地址变量,可以存放地址进行关键操作啦
    • Node h[Radix], t[Radix], *r;
    • for (int i = 0; i < Radix; i++) {
    • //初始化为NULL,防止指向随机内存,10个桶全部初始化首尾指针,抽象桶模型建立
    • h[i] = t[i] = NULL;
    • }
    • //基数级别建立,初始级别是个位,每次循环都乘以10,变成十位,百位...
    • int b = 1;
    • for (int d = 1; d <= MaxDigit; d++) {
    • // 🎯 第一步:分配节点到各个队列(桶) -> 这里的桶要是队列,因为要先进先出
    • //处理链表
    • while (p != NULL) {
    • int k = p->data / b % Radix; //取得基数,存到k处
    • //检测当前这个桶里面是不是空的,空的话就直接把p赋值给h[k]和t[k],否则就把p赋值给t[k]->next,然后t[k]指向p,把p指向下一个节点
    • if (h[k] == NULL) {
    • h[k] = t[k] = p;
    • } else {
    • t[k]->next = p;
    • t[k] = p;
    • }
    • p = p->next;
    • }
    • // 🎯 第二步:收集各个队列,重组链表,按个位排序好
    • b *= Radix;
    • for (int i = 0; i < Radix; i++) {
    • if (h[i] != NULL) {
    • if (p == NULL) {
    • p = h[i];
    • r = t[i];
    • } else {
    • r->next = h[i]; //有序地连接起来
    • r = t[i];
    • }
    • h[i] = t[i] = NULL; // 🧹 清空队列头尾指针
    • }
    • }
    • if (r != NULL) r->next = NULL; // 🎯 确保链表结尾,NULL用来结尾
    • }
    • }
    • /
  • 🎯 打印链表函数
  • 保持原始链表不被破坏
    • */
    • void printList(Node *p) {
    • while (p != NULL) {
    • printf("%d ", p->data);
    • p = p->next;
    • }
    • printf("\n");
    • }
    • int main() {
    • system("chcp 65001");
    • int arr[] = {6, 3, 8, 3, 2, 9, 6, 7, 8, 3, 2, 1};
    • int n = sizeof(arr) / sizeof(arr[0]);
    • printf("排序前: ");
    • for (int i = 0; i < n; i++) {
    • printf("%d ", arr[i]);
    • }
    • printf("\n");
    • // 🎯 从数组创建链表
    • Node *p = CreateListFromArray(arr, n);
    • printf("链表数据: ");
    • printList(p);
    • // 🎯 执行基数排序
    • radixSort(p);
    • printf("排序后: ");
    • printList(p);
    • return 0;
    • }
http://www.dtcms.com/a/499908.html

相关文章:

  • 批处理重命名遇到的几个问题
  • 网站风格的设计微信小程序开发费用一览表
  • 门户网站开发框架应用网站
  • 做网站如何调字体格式衡阳做网站ss0734
  • 云南省城乡和住房建设厅网站大连seo建站公司
  • 微服务降本增效措施
  • [优选算法专题四.前缀和——NO.27 寻找数组的中心下标]
  • 多模块exe文件和ini文件文件之间是如何耦合的
  • 【MySQL】数据库的相关操作
  • 房地产网站源码Wordpress页面无侧边栏
  • 营销神器官方网站竞价单页模板
  • Mysql初阶第十一讲:Mysql视图特性与用户管理
  • 临沂h5建站网站建设企业网银e路通
  • gpiozero 树莓派(Raspberry Pi)官方推荐的 Python GPIO 控制库
  • 如何快速搭建个人网站wordpress 发通知
  • 深圳网站建设公司收费手机排行榜软件
  • ModuleNotFoundError: No module named ‘google.protobuf‘
  • 江苏企业网站排名优化wordpress文章序号排列
  • 网站空间使用方法wordpress php版本号
  • 网站建设需要学什么证苏州保洁公司诗雨
  • 网站用户推广哈尔滨快速建站服务
  • WinForm自定义组件双击事件
  • 智慧养老平台|基于SprinBoot+vue的智慧养老平台系统(源码+数据库+文档)
  • 佛山北京网站建设公司的wordpress主机名
  • 网站建设app小程序传媒公司网站
  • 【LUT技术专题】空间感知3D查找表-SA-3DLUT
  • 编译原理机测客观题(7)优化和代码生成练习题
  • CC19-分割回文串-ii
  • 只有网站才需要域名吗怎么用 c文件做网站
  • 怎么让百度搜到自己的网站中国新闻社领导名单