Advertisement
programmer_girl

Merge stringa

Feb 14th, 2017
374
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.83 KB | None | 0 0
  1. #define N 10
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. void mergeSort(char array[], int length); //funzione che ordina per fusione l'array
  7. void sortSubArray(char array[], int low, int high); //funzione che ordina una porzione dell'array
  8. void merge(char array[], int left, int middle1, int middle2, int right); //funzione che fonde i due sottoarray ordinati in un sottoarray ordinato
  9.  
  10. int main ()
  11. {
  12. char array[N]; //dichiara l'array di stringhe da ordinare
  13. int i;
  14. printf("Inserisci stringa.\n");
  15. scanf("%s", array);
  16. puts("\nArray non ordinato:");
  17. printf("%s", array);
  18. puts("\n");
  19. puts("Array ordinato:");
  20. int size = strlen(array);
  21. mergeSort(array, size);
  22. printf("%s", array);
  23. return 0;
  24. }
  25.  
  26. //funzione che ordina per fusione l'array
  27. void mergeSort(char array[], int length)
  28. {
  29. sortSubArray(array, 0, length);
  30. }
  31.  
  32. //funzione che ordina una porzione dell'array
  33. void sortSubArray(char array[], int low, int high)
  34. {
  35. //effettua il test per il caso di base
  36. if ((high - low) >= 1) { //se non si tratta del caso di base...
  37. int middle1 = (low + high)/2;
  38. int middle2 = middle1 + 1;
  39.  
  40. //dividi l'array a metà e ordina ciascuna metà ricorsivamente
  41. sortSubArray(array, low, middle1); //prima metà
  42. sortSubArray(array, middle2, high); //seconda metà
  43.  
  44. //fondi i due array ordinati
  45. merge(array, low, middle1, middle2, high);
  46. }
  47. }
  48.  
  49. //funzione che fonde i due sottoarray ordinati in un sottoarray ordinato
  50. void merge(char array[], int left, int middle1, int middle2, int right)
  51. {
  52. int leftIndex = left; //indice nel sottoarray sinistro
  53. int rightIndex = middle2; //indice nel sottoarray destro
  54. int combinedIndex = left; //indice nell'array temporaneo
  55. char tempArray[N]; //array temporaneo
  56. int i;
  57. //fondi i due sottoarray finché non si raggiunge la fine di uno di loro
  58. while (leftIndex <= middle1 && rightIndex <= right)
  59. {
  60. //inserisci il più piccolo dei due elementi correnti nel risultato
  61. //e spostati nella posizione seguente del sottoarray
  62. if ((strcmp(array[leftIndex], array[rightIndex])) < 0)
  63. {
  64. tempArray[combinedIndex++] = array[leftIndex++];
  65. } else
  66. {
  67. tempArray[combinedIndex++] = array[rightIndex++];
  68. }
  69. }
  70.  
  71. if (leftIndex == middle2) { //fine del sottoarray sinistro?
  72. while(rightIndex <= right) //copia il sottoarray destro
  73. {
  74. tempArray[combinedIndex++] = array[rightIndex++];
  75. }
  76. } else
  77. { //fine del sottoarray destro?
  78. while(leftIndex <= middle1)
  79. { //copia il sottoarray sinistro
  80. tempArray[combinedIndex++] = array[leftIndex++];
  81. }
  82. }
  83. //ricopia indietro i valori nell'array originario
  84. for(i=left; i<=right; i++)
  85. {
  86. array[i] = tempArray[i];
  87. }
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement