fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int encontrarMaximo(int vetor[], int tamanho) {
  5. int maximo = vetor[0];
  6. for (int i = 1; i < tamanho; i++) {
  7. if (vetor[i] > maximo) {
  8. maximo = vetor[i];
  9. }
  10. }
  11. return maximo;
  12. }
  13.  
  14. // Função auxiliar para calcular o número de dígitos de um número
  15. int numeroDeDigitos(int numero) {
  16. if (numero == 0) return 1;
  17. int contador = 0;
  18. while (numero != 0) {
  19. numero /= 10;
  20. contador++;
  21. }
  22. return contador;
  23. }
  24.  
  25. // Função para obter o dígito na devida posição (0 para unidades, 1 para dezenas e assim vai)
  26. int obterDigito(int numero, int posicao) {
  27. for (int i = 0; i < posicao; i++) {
  28. numero /= 10;
  29. }
  30. return numero % 10;
  31. }
  32.  
  33. // Algoritmo auxiliar de ordenação: Bubble Sort modificado para ordenar baseado no dígito na posição 'posicao' (*BUBBLE SORT É ESTÁVEL!*)
  34. void ordenacaoBolha(int vetor[], int tamanho, int posicao) {
  35. for (int i = 0; i < tamanho - 1; i++) {
  36. for (int j = 0; j < tamanho - i - 1; j++) {
  37. if (obterDigito(vetor[j], posicao) > obterDigito(vetor[j + 1], posicao)) {
  38. // Troca os elementos
  39. int temporario = vetor[j];
  40. vetor[j] = vetor[j + 1];
  41. vetor[j + 1] = temporario;
  42. }
  43. }
  44. }
  45. }
  46.  
  47. void ordenacaoRadix(int vetor[], int tamanho) {
  48. // Encontra o número de dígitos
  49. int maximo = encontrarMaximo(vetor, tamanho);
  50. int digitos = numeroDeDigitos(maximo);
  51.  
  52. // Ordena por cada dígito, começando pelas unidades (posição 0)
  53. for (int posicao = 0; posicao < digitos; posicao++) {
  54. ordenacaoBolha(vetor, tamanho, posicao);
  55. }
  56. }
  57.  
  58. void imprimirVetor(int vetor[], int tamanho) {
  59. for (int i = 0; i < tamanho; i++) {
  60. printf("%d ", vetor[i]);
  61. }
  62. printf("\n");
  63. }
  64.  
  65. int main() {
  66. int vetor[] = {170, 45, 75, 90, 802, 24, 2, 66};
  67. int tamanho = sizeof(vetor) / sizeof(vetor[0]);
  68.  
  69. printf("Vetor original: ");
  70. imprimirVetor(vetor, tamanho);
  71.  
  72. ordenacaoRadix(vetor, tamanho);
  73.  
  74. printf("Vetor ordenado: ");
  75. imprimirVetor(vetor, tamanho);
  76.  
  77. return 0;
  78. }
Success #stdin #stdout 0s 5300KB
stdin
45
stdout
Vetor original: 170 45 75 90 802 24 2 66 
Vetor ordenado: 2 24 45 66 75 90 170 802