
Source Code in C
1: Merge – Sort
2: #include <stdio.h>
3: #include <stdlib.h> 4:
5: void Merge (int c[], // Phgh : 2 taksinomhmena tmhmata etoima gia sygxoneush 6: int d[], // Pinakas proorismou
7: int L, // Arxh tou 1ou tmhmatos 8: int M, // Telos tou 1ou tmhmatos
9: int R, // Telos tou 2ou tmhmatos 10: int *plithos); //metritis gia to plithos sigrisewn
11: void MergePass (int x[], // Phgh : me zeygaria apo taksinomhmena tmhmata 12: int y[], // Pinakas proorismou
13: int s, // Megethos tmhmatos 14: int n, // Synoliko megethos tou x[] kai tou y[]
15: int *plithos); //metritis gia to plithos sigrisewn 16: void MergeSort (int a[], //Pinakas gia taksinomisi
17: int b[], //bohthitikos pinakas 18: int n, // Arithmos stoixeiwn ston a[]
19: int *plithos); //metritis gia to plithos sigrisewn 20:
21: int main()main()() 22: {
23: int plithos; 24: int max;
25: int i; 26: int *x;
27: int *z; 28: printf("dose to megethos toy pinaka:");
29: scanf("%d",&max); 30: x=(int*)malloc(max*sizeof(int));
31: i=0; 32: while(i<max)
33: { 34: printf("\nDwse ena x%d arithmo: ",i);
35: scanf("%d",&x[i]); 36: i++;
37: } 38: i=0;
39: printf("\nOi arithmoi tou X pinaka einai:\n"); 40: while(i<max)
41: { 42: printf("%d,",x[i]);
43: i++; 44: }
45: i=0; 46: plithos=0;
47: MergeSort(x,z,max,&plithos); 48: i=0;
49: printf("\nO neos Z pinakas einai:\n"); 50: while(i<max)
51: { 52: printf("%d,",x[i]);
53: i++; 54: }
55: printf("\nto plithos ton sygkriseon pou eginan einai: %d",plithos); 56: return 0;
57: } 58:
59: 60: //Sugxoneuei ta: c[L:M] , c[M+1:R] sto d[L:R]
61: void Merge (int c[], // Phgh : 2 taksinomhmena tmhmata etoima gia sygxoneush 62: int d[], // Pinakas proorismou
63: int L, // Arxh tou 1ou tmhmatos 64: int M, // Telos tou 1ou tmhmatos
65: int R, // Telos tou 2ou tmhmatos 66: int *plithos) //metritis gia to plithos sigrisewn
67: { 68: int i = L, // deikths gia to 1o tmhma
69: j = M+1, // deikths gia to 2o 70: k = L; // deikths gia to apotelesma
71: 72: // sygxoneuei mexri to i h to j ginoun megalutera ap'to megethos twn adistoixwn tmhmatwn
73: while ( (i <= M) && (j <= R) ) 74: {
75: (*plithos)++; 76: if (c[i] <= c[j]) d[k++] = c[i++];
77: else d[k++] = c[j++]; 78: }
79: 80: // analambanei ta ypoloipa stoixeia
81: while ( i <= M ) 82: d[k++] = c[i++];
83: while ( j <= R ) 84: d[k++] = c[j++];
85: } 86:
87: //Sygxoneuei taksinomimena tmhmata megethous 's'. 88: void MergePass (int x[], // Phgh : me zeygaria apo taksinomhmena tmhmata
89: int y[], // Pinakas proorismou 90: int s, // Megethos tmhmatos
91: int n, // Synoliko megethos tou x[] kai tou y[] 92: int *plithos) //metritis gia to plithos sigrisewn
93: { 94: int i=0; // Arxikos deikths gia ta tmhmata pou epeksergazontai
95: int j; 96:
97: // xeirizetai ola ta zeygaria twn tmhmatwn plhrous-megethous 98: while (i <= n - 2 * s)
99: { 100: // Sygxoneuei 2 taksinomhmena tmhmata megethous 's'
101: Merge (x, y, i, i+s-1, i+2*s-1,plithos); 102: i = i + 2*s;
103: } 104: //ligotera apo 2s stoixeia menoun
105: if (i + s < n) 106: Merge (x, y, i, i+s-1, n-1,plithos);
107: else 108: for ( j = i; j <= n-1; j++)
109: y[j] = x[j]; //antigrafei to teleytaio tmhma sto y 110: }
111: // Taksinomei ton pinaka a[0:n-1] . 112: void MergeSort (int a[], //Pinakas gia taksinomisi
113: int b[], //bohthitikos pinakas 114: int n, // Arithmos stoixeiwn ston a[]
115: int *plithos) //metritis gia to plithos sigrisewn 116: {
117: int s = 1; // megethos tmhmatos 118: while (s < n)
119: { 120: MergePass (a, b, s, n,plithos); // sygxoneuei apo ton a[] ston b[]
121: s += s; // diplasiazei to megethos tou tmhmatos 122: MergePass (b, a, s, n,plithos); // sygxoneuei apo ton b[] ston a[]
123: s += s; // ksanadiplasiazei to megethos tou tmhmatos 124: }
125: }