📜  基数排序的C程序(1)

📅  最后修改于: 2023-12-03 15:23:39.965000             🧑  作者: Mango

基数排序的C程序

基数排序是一种非比较排序算法,它按照数字的位数进行排序。基数排序可以用于排序数字、字母和其他数据类型。在本篇文章中,我们将介绍基数排序的C程序实现。

概述

基数排序的基本思想是,将每个数按位数拆分,然后按照每个位数的大小依次对待排序的数据进行排序。这种排序方法的时间复杂度与数字位数有关,通常比快速排序和归并排序等传统排序算法具有更好的性能特点。但是,基数排序需要使用额外的空间进行排序。

程序实现

我们将实现以下C程序,用于对一个整数数组进行基数排序。

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

// 获取数组中最大的数字
int getMax(int arr[], int n) {
    int max = arr[0];
    for (int i = 1; i < n; i++) {
        if (arr[i] > max) {
            max = arr[i];
        }
    }
    return max;
}

// 对数组按照exp位上的数字进行排序
void countingSort(int arr[], int n, int exp) {
    int output[n];
    int i, count[10] = {0};

    for (i = 0; i < n; i++) {
        count[(arr[i] / exp) % 10]++;
    }

    for (i = 1; i < 10; i++) {
        count[i] += count[i - 1];
    }

    for (i = n - 1; i >= 0; i--) {
        output[count[(arr[i] / exp) % 10] - 1] = arr[i];
        count[(arr[i] / exp) % 10]--;
    }

    for (i = 0; i < n; i++) {
        arr[i] = output[i];
    }
}

// 对数组进行基数排序
void radixSort(int arr[], int n) {
    int max = getMax(arr, n);
    for (int exp = 1; max / exp > 0; exp *= 10) {
        countingSort(arr, n, exp);
    }
}

// 打印数组
void printArray(int arr[], int n) {
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main() {
    int arr[] = {20, 23, 53, 10, 88, 69, 32, 34, 23, 25};

    int n = sizeof(arr) / sizeof(arr[0]);

    radixSort(arr, n);

    printf("Sorted array: ");
    printArray(arr, n);

    return 0;
}
代码解析

这段程序包括了三个函数,分别是:

  1. getMax (arr, n): 找到数组arr中最大的数字并返回。
  2. countingSort (arr, n, exp): 对数组arr根据exp位上的数字进行计数排序。在程序中,定义了一个输出数组 output,定义了 一个数组count来记录各个数字出现的次数。在第一次循环中,我们将arr数组中每个数字的exp位上的数字出现的次数保存到count数组中。接下来,我们在第二次循环中计算count数组中每个数字出现的位置。在第三次循环中,我们对arr数组按照exp位上的数字进行排序。
  3. radixSort (arr, n): 对整个数组进行基数排序。我们需要找到数组中最大的数字并确定最高位数。我们使用countingSort函数依次对每个位数进行排序。

在main函数中,我们对一个整数数组进行了基数排序,然后打印排序后的数组。

总结

基数排序是一种比较高效的排序算法,不过需要额外的空间进行排序。这里我们实现的代码只能用于整数数组排序,如果需要对其他数据类型进行排序,需要修改countingSort函数的实现。