Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define N 10
- #include <stdio.h>
- #include <stdlib.h>
- void mergeSort(int array[], int length); //funzione che ordina per fusione l'array
- void sortSubArray(int array[], int low, int high); //funzione che ordina una porzione dell'array
- void merge(int array[], int left, int middle1, int middle2, int right); //funzione che fonde i due sottoarray ordinati in un sottoarray ordinato
- int main ()
- {
- int array[N]; //dichiara l'array di int da ordinare
- int i;
- for(i=0; i<N; i++)
- {
- printf("Inserisci elemento %d nell'array.\n", i + 1);
- scanf("%d", &array[i]);
- }
- puts("\nArray non ordinato:");
- for(i=0; i<N; i++)
- {
- printf("%d ", array[i]);
- }
- puts("\n");
- puts("Array ordinato:");
- mergeSort(array, N);
- for (i=0; i<N; i++)
- {
- printf("%d ", array[i]);
- }
- system("pause");
- return 0;
- }
- //funzione che ordina per fusione l'array
- void mergeSort(int array[], int length)
- {
- sortSubArray(array, 0, length - 1);
- }
- //funzione che ordina una porzione dell'array
- void sortSubArray(int array[], int low, int high)
- {
- //effettua il test per il caso di base
- if ((high - low) >= 1) { //se non si tratta del caso di base...
- int middle1 = (low + high)/2;
- int middle2 = middle1 + 1;
- //dividi l'array a metà e ordina ciascuna metà ricorsivamente
- sortSubArray(array, low, middle1); //prima metà
- sortSubArray(array, middle2, high); //seconda metà
- //fondi i due array ordinati
- merge(array, low, middle1, middle2, high);
- }
- }
- //funzione che fonde i due sottoarray ordinati in un sottoarray ordinato
- void merge(int array[], int left, int middle1, int middle2, int right)
- {
- int leftIndex = left; //indice nel sottoarray sinistro
- int rightIndex = middle2; //indice nel sottoarray destro
- int combinedIndex = left; //indice nell'array temporaneo
- int tempArray[N]; //array temporaneo
- int i;
- //fondi i due sottoarray finché non si raggiunge la fine di uno di loro
- while (leftIndex <= middle1 && rightIndex <= right)
- {
- //inserisci il più piccolo dei due elementi correnti nel risultato
- //e spostati nella posizione seguente del sottoarray
- if (array[leftIndex] <= array[rightIndex])
- {
- tempArray[combinedIndex++] = array[leftIndex++];
- } else
- {
- tempArray[combinedIndex++] = array[rightIndex++];
- }
- }
- if (leftIndex == middle2) { //fine del sottoarray sinistro?
- while(rightIndex <= right) //copia il sottoarray destro
- {
- tempArray[combinedIndex++] = array[rightIndex++];
- }
- } else
- { //fine del sottoarray destro?
- while(leftIndex <= middle1)
- { //copia il sottoarray sinistro
- tempArray[combinedIndex++] = array[leftIndex++];
- }
- }
- //ricopia indietro i valori nell'array originario
- for(i=left; i<=right; i++)
- {
- array[i] = tempArray[i];
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement