📅  最后修改于: 2023-12-03 15:23:39.965000             🧑  作者: Mango
基数排序是一种非比较排序算法,它按照数字的位数进行排序。基数排序可以用于排序数字、字母和其他数据类型。在本篇文章中,我们将介绍基数排序的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;
}
这段程序包括了三个函数,分别是:
getMax (arr, n)
: 找到数组arr中最大的数字并返回。countingSort (arr, n, exp)
: 对数组arr根据exp位上的数字进行计数排序。在程序中,定义了一个输出数组 output,定义了 一个数组count来记录各个数字出现的次数。在第一次循环中,我们将arr数组中每个数字的exp位上的数字出现的次数保存到count数组中。接下来,我们在第二次循环中计算count数组中每个数字出现的位置。在第三次循环中,我们对arr数组按照exp位上的数字进行排序。radixSort (arr, n)
: 对整个数组进行基数排序。我们需要找到数组中最大的数字并确定最高位数。我们使用countingSort函数依次对每个位数进行排序。在main函数中,我们对一个整数数组进行了基数排序,然后打印排序后的数组。
基数排序是一种比较高效的排序算法,不过需要额外的空间进行排序。这里我们实现的代码只能用于整数数组排序,如果需要对其他数据类型进行排序,需要修改countingSort函数的实现。