1. Principe
Le tri dit radix 基数
est 进制
le radix lorsque nous en parlons . Par exemple, la base du nombre décimal est 10 et la base du binaire est 2. Parmi eux, la nième position de droite à gauche représente en fait la n-ième puissance de la base. Par exemple, 101 2 signifie 1 ⋅ 2 0 + 0 ⋅ 2 1 + 1 ⋅ 2 2 1 \ cdot2 ^ 0 + 0 \ cdot2 ^ 1 + 1 \ cdot2 ^ 21⋅20+0⋅21+1⋅22
Ensuite, nous pouvons trier en comparant d'abord un certain bit, puis comparer un autre bit pour le tri, jusqu'à ce que tous les chiffres soient arrangés. Par exemple, nous pouvonsLSD低位优先法
comparer un bit de droite à gauche ou comparerMSD高位优先法
un bit de gauche à droite et comparer un bit de gauche à droite.
traiter:
- Créez un nombre de base de files d'attente et l'indice commence à 0.
- Prendre la valeur d'un mot clé et le stocker dans la file d'attente numérotée correspondante (un peu comme une table de hachage)
- À partir de 0 ou de la file d'attente de base -1, retirez la file d'attente par incréments ou décrémentations, de sorte que la table de séquence et la liste chaînée formées par les files d'attente soient dans un certain ordre.
- Modifiez à plusieurs reprises le nombre de chiffres, et 2, 3, jusqu'à ce que tous les chiffres soient dans l'ordre et que le dernier hors de la file d'attente soit dans l'ordre.
Deux. Processus
Généralement, nous utilisons le système décimal, il est donc plus intuitif de prendre une base de 10.
Supposons que nous triions ces nombres dans un ordre inférieur en premier:
trier l'
ordre inférieur: trier le
prochain ordre inférieur : ordre inférieur à nouveau:
c'est l'image.
Trois. Code
Le code est très très simple, donc je ne veux pas l’écrire. Copiez le code. Tutoriel novice 1.10 Tri par cardinalité :
#include<stdio.h>
#define MAX 20
//#define SHOWPASS
#define BASE 10
void print(int *a, int n) {
int i;
for (i = 0; i < n; i++) {
printf("%d\t", a[i]);
}
}
void radixsort(int *a, int n) {
int i, b[MAX], m = a[0], exp = 1;
for (i = 1; i < n; i++) {
if (a[i] > m) {
m = a[i];
}
}
while (m / exp > 0) {
int bucket[BASE] = {
0 };
for (i = 0; i < n; i++) {
bucket[(a[i] / exp) % BASE]++;
}
for (i = 1; i < BASE; i++) {
bucket[i] += bucket[i - 1];
}
for (i = n - 1; i >= 0; i--) {
b[--bucket[(a[i] / exp) % BASE]] = a[i];
}
for (i = 0; i < n; i++) {
a[i] = b[i];
}
exp *= BASE;
#ifdef SHOWPASS
printf("\nPASS : ");
print(a, n);
#endif
}
}
int main() {
int arr[MAX];
int i, n;
printf("Enter total elements (n <= %d) : ", MAX);
scanf("%d", &n);
n = n < MAX ? n : MAX;
printf("Enter %d Elements : ", n);
for (i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
printf("\nARRAY : ");
print(&arr[0], n);
radixsort(&arr[0], n);
printf("\nSORTED : ");
print(&arr[0], n);
printf("\n");
return 0;
}