基数排序
发布日期:2021-05-08 22:25:52 浏览次数:22 分类:精选文章

本文共 2388 字,大约阅读时间需要 7 分钟。

一. 基数排序是什么?

基数排序是一种针对整数的非比较型排序算法,它通过将整数按照位数分割成独立的数字,并依据这些数字对整数进行排序。这一方法不需要进行比较,因此可以在某些情况下超越比较排序的效率限制。

基数排序的核心思想是将整数从最低位(个位)开始,逐步向高位(如十位、百位等)排序。在每一轮排序中,数字的某一位会被固定,然后在下一轮排序中处理下一高位。整个过程类似于对数字进行逐位排列,最终将数字按照从低到高的顺序排列完毕。

二. 基数排序的工作原理

为了更好地理解基数排序,我们可以通过具体例子来分析其过程。以数组 {27, 91, 1, 97, 17, 23, 84, 28, 72, 5, 67, 25} 为例,我们可以按照以下步骤进行基数排序:

  • 按个位数排序

    首先,我们将数组中的所有数字按其个位数字从小到大排列。

    数字 1 27 28 5 67 72 84 91 23 97 25
    排序后 1 5 17 23 25 27 28 67 72 84 91 97

    排完个位后,得到的新数组为 {1,5,17,23,25,27,28,67,72,84,91,97}

  • 按十位数排序

    接下来,使用已排序好的数组,按照十位数字重新排列。

    数字 1 5 17 23 25 27 28 67 72 84 91
    排序后 1 5 17 23 25 27 28 67 72 84 91

    通过这种方式,我们可以看到每一位的排序会确定整体的位置,因此我们只需要继续将高位进行排序。

  • 继续高位排序

    当只剩下最后一组数字时,所有位都已排序,此时数组为完整的从小到大的顺序。

  • 最终,通过逐位排序,数组将被完全排序为 {1, 5, 17, 23, 25, 27, 28, 67, 72, 84, 91, 97}

    三. C++代码实现

    #include 
    #include
    using namespace std;
    template
    void print(E A[], int n) {
    for (int i = 0; i < n; ++i) {
    if (i == n - 1) {
    cout << A[i] << endl;
    } else {
    cout << A[i] << " ";
    }
    }
    }
    template
    void radix_sort(E A[], E B[], int n, int k, int r, int cnt[]) {
    int j;
    for (int i = 0; i < k; ++i) {
    for (j = n - 1; j >= 0; --j) {
    int key = A[j] / (r * (1 + i));
    if (cnt[key] > 0) {
    B[--cnt[key]] = A[j];
    } else {
    B[n] = A[j];
    }
    }
    for (j = 0; j < n; ++j) {
    int key = A[j] / (r * (1 + i));
    B[j] = A[j];
    }
    for (i = 0; i < k; ++i) {
    for (j = n - 1; j >= 0; --j) {
    key = A[j] / (r * (1 + i));
    if (cnt[key]) {
    B[--cnt[key]] = A[j];
    } else {
    B[n] = A[j];
    }
    }
    }
    }
    }
    int main() {
    vector
    arr = {27, 91, 1, 97, 17, 23, 84, 28, 72, 5, 67, 25};
    vector
    sorted_arr(arr.size(), 0); int cnt[20] = {0}; radix_sort(arr, sorted_arr, arr.size(), 3, 10, cnt); print(sorted_arr, arr.size()); return 0; }

    代码解释

  • print 函数

    该函数用于打印数组中的元素。它遍历数组,逐个打印出每个元素,最后输出一个换行符,确保格式美观。

  • radix_sort 函数

    该函数是基数排序的核心逻辑。它接受多个参数,包括待排序数组 A,辅助数组 B,数组长度 n,排序的位数 k,基数 r,以及每个键值对应的元素个数 cnt[]。在每一轮迭代中,它会对数组中的某一位进行排序。

  • 主函数

    初始化需要排序的数组 arr,辅助数组 sorted_arr 和计数数组 cnt。调用 radix_sort 函数进行基数排序,并打印排序结果。

  • 通过以上内容,读者可以清楚地了解基数排序的原理及其在 C++ 中的实现方式。

    上一篇:希尔排序
    下一篇:选择排序

    发表评论

    最新留言

    做的很好,不错不错
    [***.243.131.199]2025年04月06日 20时58分51秒