Advertisement
programmer_girl

Merge int

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