计数排序和基数计数排序的区别
时间: 2024-03-17 12:26:54 浏览: 25
计数排序和基数计数排序都是线性时间复杂度的排序算法,但是它们的实现方式有所不同。
计数排序:
计数排序是一种非比较排序,它的核心思想就是统计每个元素出现的次数,然后根据元素出现的次数来排序。具体实现步骤如下:
1. 统计每个元素出现的次数
2. 对每个元素出现的次数进行累加,得到每个元素排序后的位置
3. 根据每个元素排序后的位置,将元素按顺序放入新的数组中
计数排序适用于数据范围比较小的情况。
基数计数排序:
基数计数排序是一种多关键字排序算法,它的核心思想是将待排序的元素按照其各位数字的大小依次比较,从低位到高位进行排序。具体实现步骤如下:
1. 将待排序元素按照个位数的大小进行排序,得到一个临时数组
2. 将临时数组中的元素按照十位数的大小进行排序,得到一个新的临时数组
3. 将新的临时数组中的元素按照百位数的大小进行排序,得到最终的排序结果
基数计数排序适用于数据范围比较大的情况,但是需要保证每个关键字的取值范围不太大。
相关问题
计数排序是基数排序吗
计数排序和基数排序都是非比较排序,但是它们是不同的排序算法。计数排序是一种线性时间复杂度的排序算法,它的时间复杂度为O(n+k),其中n是待排序元素的个数,k是待排序元素中最大值和最小值的差值加1。计数排序的基本思想是对于给定的输入序列中的每一个元素x,确定该序列中值小于x的元素的个数,利用这一信息,就可以将x直接存放到最终的输出序列的正确位置上。而基数排序则是根据元素的位数进行排序,它的时间复杂度为O(d(n+k)),其中d是元素的位数。因此,计数排序不是基数排序。
基数计数排序代码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;
}
// 基数计数排序
void radixCountSort(int arr[], int n) {
int exp = 1;
int *output = (int*)malloc(n * sizeof(int));
int max = getMax(arr, n);
while (max / exp > 0) {
int count[10] = {0};
for (int i = 0; i < n; i++) {
count[(arr[i] / exp) % 10]++;
}
for (int i = 1; i < 10; i++) {
count[i] += count[i - 1];
}
for (int i = n - 1; i >= 0; i--) {
output[count[(arr[i] / exp) % 10] - 1] = arr[i];
count[(arr[i] / exp) % 10]--;
}
for (int i = 0; i < n; i++) {
arr[i] = output[i];
}
exp *= 10;
}
free(output);
}
// 打印排序后的数组
void printArr(int arr[], int n) {
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int arr[] = {170, 45, 75, 90, 802, 24, 2, 66};
int n = sizeof(arr) / sizeof(arr[0]);
radixCountSort(arr, n);
printf("排序后的数组:\n");
printArr(arr, n);
return 0;
}
```
该代码首先定义了一个获取数列中最大值的函数 `getMax`,然后实现了基数计数排序的函数 `radixCountSort`,其中使用了一个输出数组 `output`,在排序过程中不断更新该数组,最后将其赋值回原数组 `arr` 中。最后定义了一个打印排序后的数组的函数 `printArr`,并在 `main` 函数中调用这些函数进行测试。