[Fiche d'apprentissage de la structure des données 29] - Tri de cardinalité

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 ^ 2120+021+122
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:

  1. Créez un nombre de base de files d'attente et l'indice commence à 0.
  2. 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)
  3. À 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.
  4. 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:
Insérez la description de l'image ici
trier l'
Insérez la description de l'image ici
ordre inférieur: trier le
Insérez la description de l'image ici
prochain ordre inférieur : ordre inférieur à nouveau:
Insérez la description de l'image ici
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;
}

Je suppose que tu aimes

Origine blog.csdn.net/u011017694/article/details/111564378
conseillé
Classement