C语言中数据结构之链式基数排序

C语言中数据结构之链式基数排序

概述

链式基数排序是基数排序的一种实现方式。基数排序是一种桶排序算法,它通过将需要排序的数据分成多个桶,并且按照一定的顺序将数据从桶中取出来,以达到排序的目的。链式基数排序则使用了链表结构来实现桶的功能。

实现步骤

链式基数排序的实现步骤如下:

  1. 申请链表节点数组,并初始化链表头结点数组。链表的数量等于指定的基数,例如10进制的基数为10。
  2. 从个位开始,依次按照当前位数的值分配到对应链表上。例如对于数字123,第一次排序时将其分配到个位数字为3的链表上。
  3. 对每个链表进行排序。可以使用插入排序,归并排序等算法。
  4. 将所有排序后的链表按照顺序连接起来,即为最终排序结果。
  5. 重复第2-4步,直到所有位数都排序完毕为止。

代码示例

以下是一个10进制链式基数排序的示例代码:

#include <stdio.h>
#include <stdlib.h>

#define MAX_DIGIT 10
#define BUCKET_SIZE 10

typedef struct node
{
    int value;
    struct node* next;
} Node;

void radix_sort(int arr[], int n);

void print_array(int arr[], int n);

int main()
{
    int arr[] = {123, 432, 789, 623, 345, 998, 345};
    int n = sizeof(arr) / sizeof(arr[0]);

    printf("Before sorting:\n");
    print_array(arr, n);

    radix_sort(arr, n);

    printf("\nAfter sorting:\n");
    print_array(arr, n);

    return 0;
}

void radix_sort(int arr[], int n)
{
    int i, j, digit;
    int divisor = 1;
    Node* buckets[MAX_DIGIT] = { NULL };
    Node* cur, * tail;

    for (digit = 1; digit <= MAX_DIGIT; divisor *= 10, digit++)
    {
        for (i = 0; i < n; i++)
        {
            int index = (arr[i] / divisor) % BUCKET_SIZE;
            cur = malloc(sizeof(Node));
            cur->value = arr[i];
            cur->next = buckets[index];
            buckets[index] = cur;
        }

        int k = 0;
        for (i = 0; i < BUCKET_SIZE; i++)
        {
            cur = buckets[i];
            tail = NULL;
            while (cur != NULL)
            {
                arr[k++] = cur->value;
                tail = cur;
                cur = cur->next;
                free(tail);
            }
            buckets[i] = NULL;
        }
    }
}

void print_array(int arr[], int n)
{
    for (int i = 0; i < n; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

输出结果为:

Before sorting:
123 432 789 623 345 998 345

After sorting:
123 345 345 432 623 789 998

以上示例代码演示了一个基本的链式基数排序,对于任何进制的链式基数排序而言,其中基数为10或者2不算太大规模,实际上,我们经常用链式基数排序来处理非常庞大的数据集。接下来,我们来看一个8进制链式基数排序的示例。

#define MAX_DIGIT 3
#define BUCKET_SIZE 8

void radix_sort(int arr[], int n);

void print_array(int arr[], int n);

int main()
{
    int arr[] = {012, 456, 765, 012, 255, 377, 234};
    int n = sizeof(arr) / sizeof(arr[0]);

    printf("Before sorting:\n");
    print_array(arr, n);

    radix_sort(arr, n);

    printf("\nAfter sorting:\n");
    print_array(arr, n);

    return 0;
}

void radix_sort(int arr[], int n)
{
    int i, j, digit;
    int divisor = 1;
    Node* buckets[MAX_DIGIT] = { NULL };
    Node* cur, * tail;

    for (digit = 1; digit <= MAX_DIGIT; divisor *= BUCKET_SIZE, digit++)
    {
        for (i = 0; i < n; i++)
        {
            int index = (arr[i] / divisor) % BUCKET_SIZE;
            cur = malloc(sizeof(Node));
            cur->value = arr[i];
            cur->next = buckets[index];
            buckets[index] = cur;
        }

        int k = 0;
        for (i = 0; i < BUCKET_SIZE; i++)
        {
            cur = buckets[i];
            tail = NULL;
            while (cur != NULL)
            {
                arr[k++] = cur->value;
                tail = cur;
                cur = cur->next;
                free(tail);
            }
            buckets[i] = NULL;
        }
    }
}

void print_array(int arr[], int n)
{
    for (int i = 0; i < n; i++)
    {
        printf("%o ", arr[i]);
    }
    printf("\n");
}

输出结果为:

Before sorting:
10 456 765 10 255 377 234

After sorting:
10 10 234 255 377 456 765

结论

链式基数排序是一种高效的排序算法,可以适用于大规模数据集的排序。实现链式基数排序的关键是使用链表结构来实现排序过程中的桶,可以使用插入排序,归并排序等算法来进行桶内部的排序,以达到排序的目的。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言中数据结构之链式基数排序 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • 数据结构课程设计-用栈实现表达式求值的方法详解

    数据结构课程设计-用栈实现表达式求值的方法详解 本文将详细讲解如何用栈实现表达式求值的方法。根据表达式的不同形式(中缀表达式、前缀表达式、后缀表达式),我们可以采用不同的方法来实现表达式求值。在本文中,我们将主要讲解中缀表达式求值的过程。 中缀表达式求值的步骤 中缀表达式通常是我们最常接触到的表达式形式,如 2+3*4-5。在求解中缀表达式的结果时,我们通常…

    数据结构 2023年5月16日
    00
  • ecnuoj 5039 摇钱树

    5039. 摇钱树 题目链接:5039. 摇钱树 感觉在赛中的时候,完全没有考虑分数规划这种做法。同时也没有想到怎么拆这两个交和并的式子。有点难受…… 当出现分数使其尽量大或者小,并且如果修改其中直接相关的某个值会导致分子分母同时变化的时候,还是要多想想分数规划的做法。 下面引用一下题解 另外这两个交和并的式子,令 \(a = S \and T, b = T…

    算法与数据结构 2023年4月17日
    00
  • Java数据结构二叉树难点解析

    Java数据结构二叉树难点解析 什么是二叉树 二叉树是一种非常常见的数据结构,它具有以下特点: 每个节点都最多有两个子节点。 左子节点的值小于等于父节点的值,右子节点的值大于等于父节点的值。 二叉树可以用递归的方式实现,如下所示: class TreeNode { int val; TreeNode left; TreeNode right; TreeNod…

    数据结构 2023年5月17日
    00
  • 「学习笔记」数位 DP

    「学习笔记」数位 DP 意义不大的题不写了。 点击查看目录 目录 「学习笔记」数位 DP 概述 例题 P2657 [SCOI2009] windy 数 思路 代码 P4317 花神的数论题 思路 P4124 [CQOI2016]手机号码 思路 代码 haha数 题意 思路 代码 0和1的熟练 题意 思路 代码 苍与红的试炼 题意 思路 代码 概述 数位 DP…

    算法与数据结构 2023年4月17日
    00
  • 带你了解Java数据结构和算法之高级排序

    带你了解Java数据结构和算法之高级排序攻略 什么是高级排序算法? 在计算机科学中,排序算法是将一串数据按照特定顺序进行排列的一种算法。根据数据规模、数据类型、稳定性、时间复杂度以及空间复杂度等因素,排序算法分为许多种类。高级排序算法是相对于普通排序算法而言,其时间复杂度更低、排序速度更快、稳定性更高的算法。 高级排序算法的分类及特点 高级排序算法分为内排序…

    数据结构 2023年5月17日
    00
  • AtCoder Beginner Contest 300

    A – N-choice question (abc300 a) 题目大意 给定一个元素互不相同的数组\(c\)和 \(a,b\),找到 \(i\)使得 \(c_i = a + b\) 解题思路 直接for循环寻找即可。 神奇的代码 #include <bits/stdc++.h> using namespace std; using LL = …

    算法与数据结构 2023年4月30日
    00
  • 带你了解Java数据结构和算法之队列

    带你了解Java数据结构和算法之队列 一、介绍 队列是已知的最古老和最常用的数据结构之一。它是一个线性结构,它遵循一个先进先出的原则,在日常生活中我们也很容易碰到队列。比如:在银行排队办理业务、队列中的电影厅、厨房中的菜单等等。 队列的操作主要有两种:入队(enqueue)和出队(dequeue)。插入操作只能在队尾进行,删除操作只能在队头进行。还有一些常用…

    数据结构 2023年5月17日
    00
  • CSP-何以包邮?

    题目描述 新学期伊始,适逢顿顿书城有购书满 x 元包邮的活动,小 P 同学欣然前往准备买些参考书。一番浏览后,小 P 初步筛选出 n 本书加入购物车中,其中第 i 本(1≤i≤n)的价格为 ai 元。考虑到预算有限,在最终付款前小 P 决定再从购物车中删去几本书(也可以不删),使得剩余图书的价格总和 m 在满足包邮条件(m≥x)的前提下最小。 试帮助小 P …

    算法与数据结构 2023年5月11日
    00
合作推广
合作推广
分享本页
返回顶部