#include <stdio.h> #include <stdlib.h> #include <time.h> void Merge(int A[],int p,int q,int r) { int n1; int n2; int *L; int *R; int i; int j; int k; n1 = q-p+1; n2 = r-q; L = (int *)malloc(n1 * sizeof(int)); R = (int *)malloc(n2 * sizeof(int)); for (i = 0; i < n1;++i) L[i] = A[p+i]; for (i = 0; i < n2;++i) R[i] = A[q+i+1]; i = j = 0; for (k = p; k <= r; ) { if (i < n1 && j < n2) { if (L[i] <= R[j]) A[k++] = L[i++]; else if (L[i] > R[j]) A[k++] = R[j++]; } if (j == n2) A[k++] = L[i++]; else if (i == n1) A[k++] = R[j++]; } free(L); free(R); } void MergeSort(int A[],int p, int r) { if (p < r) { int q = (p + r) / 2; MergeSort(A,p,q); MergeSort(A,q+1,r); Merge(A,p,q,r); } } int main() { int i; int A[10]; srand(time(NULL)); for (i = 0; i < 10; ++i) { A[i] = rand() % 20; printf("%d ",A[i]); } printf("/n"); MergeSort(A,0,9); for (i = 0; i < 10; ++i) printf("%d ",A[i]); printf("/n"); return 0; }//2009 11 11 #include <iostream> #include <ctime> using namespace std; void Merge(int A[],int low,int mid,int high) { int *P = new int[mid-low+1],*Q = new int[high-mid]; int i,j,k; for (i =0;i < mid - low +1;++i) P[i] = A[i+low]; for (i = 0; i < high - mid;++i) Q[i] = A[mid+1+i]; i = j = 0,k = low; while ((i <= mid-low) && (j <= high-mid-1)) { if (P[i] <= Q[j]) A[k++] = P[i++]; else A[k++]= Q[j++]; } if (i > mid - low) { for (;j <= high-mid-1;++j) A[k++] = Q[j]; } else { for (; i<= mid - low;++i) A[k++] = P[i]; } delete [] P; delete [] Q; } void MergeSort(int A[],int left,int right) { if (left < right) { int i = (left + right) / 2; MergeSort(A,left,i); MergeSort(A,i+1,right); Merge(A,left,i,right); } } int main(void) { int A[10]; srand(time(NULL)); for (int i = 0; i < 10;++i) { A[i] = rand() % 100; } for (int i = 0; i < 10;++i) cout << A[i] << " "; cout << endl; MergeSort(A,0,9); for (int i = 0; i < 10;++i) cout << A[i] << " "; cout << endl; return 0; }