#include <stdio.h> #include <stdlib.h> #include <string.h> void merge_sort(int* a, int* tmp, int left, int right); void merge(int* a, int* b, int left, int middle, int right); void copy(int *a, int *tmp, int left, int right); int main(int argc, char** argv) { int* a = (int*) malloc(100 * sizeof(int)); int* tmp = (int*) malloc(100 * sizeof(int)); int i = 0; while (scanf("%d", &a[i++]) && i < 20) { //do nothing } merge_sort(a, tmp, 0, i - 2); int j = 0; for (; j < i -1; j++) { printf("%d/t", a[j]); } return 0; } void merge_sort(int a[], int* tmp, int left, int right) { if (left < right) { int i = (left + right) / 2; merge_sort(a, tmp, left, i); merge_sort(a, tmp, i + 1, right); merge(a, tmp, left, i, right); copy(a, tmp, left, right); } } void merge(int a[], int b[], int left, int middle, int right) { int i = left; int j = middle + 1; int k = left; while (i <= middle && j <= right) { if (a[i] <= a[j]) { b[k++] = a[i++]; } else { b[k++] = a[j++]; } } if (i > middle) { for (; j <= right; j++) { b[k++] = a[j]; } } else { for (; i <= middle; i++) { b[k++] = a[i]; } } } void copy(int *a, int *tmp, int left, int right) { memcpy(a + left, tmp + left, sizeof(int) * (right - left + 1)); /*aint i = left; for (; i <= right; i++) { a[i] = tmp[i]; }*/ } #include <stdio.h> #include <stdlib.h> template <class Type> void merge_sort(Type a[], int n) { Type* b = (Type*) malloc(n * sizeof(Type)); int s = 1; while (s < n) { merge_pass(a, b, s, n); s <<= 1; merge_pass(b, a, s, n); s <<= 1; } } template <class Type> void merge_pass(Type x[], Type y[], int half_width, int length) { int i = 0; while (i <= length - 2 * half_width) { merge(x, y, i, i + half_width - 1, i + 2 * half_width -1); i = i + 2 * half_width; } if (i + half_width < length) { merge(x, y, i, i + half_width - 1, length -1); } else { for(; i <= length - 1; i++) { y[i] = x[i]; } } } template <class Type> void merge(Type source[], Type destination[], int left, int middle, int right) { int i = left; int j = middle + 1; int k = left; while (i <= middle && j <= right) { if (source[i] <= source[j]) { destination[k++] = source[i++]; } else { destination[k++] = source[j++]; } } if (i > middle) { for (; j <= right; j++) { destination[k++] = source[j]; } } else { for (; i <= middle; i++) { destination[k++] = source[i]; } } } int main(int argc, char** argv) { float* a = (float*) malloc(100 * sizeof(int)); int i = 0; while (scanf("%f", &a[i++]) && i < 5) { //do nothing } merge_sort(a, 5); for (i = 0; i < 5; i++) { printf("%f/t", a[i]); } return 0; } #include <stdio.h> #include <stdlib.h> template <class Type> void natural_divide(Type a[], int divide[], int n) { int i = 1; int j = 0; for (; i < n; i++) { if (a[i] < a[i - 1]) { divide[j++] = i - 1; } } divide[j++] = n - 1; divide[j] = -1; for (j = 0; j < n + 1; j++) { printf("%d/t", divide[j]); } printf("/n"); } template <class Type> void merge_sort(Type a[], int n) { Type* b = (Type*) malloc(n * sizeof(Type)); int* divide = (int*) malloc((n + 1) *sizeof(int)); natural_divide(a, divide, n); int i = 0; int j = 0; int left = 0; int middle = 0; int right = 0; while (!(i == 0 && divide[i] == n - 1)) { if (i == 0) { left = 0; } if (divide[i] < 0) { if (i % 2 == 1) { divide[j++] = divide[i - 1]; } divide[j] = -1; i = 0; j = 0; left = 0; right = 0; continue; } if (i % 2 == 0) { middle = divide[i]; } else if (i % 2 == 1) { right = divide[i]; merge(a, b, left, middle, right); int m = left; for (; m <= right; m++) { a[m] = b[m]; } left = right + 1; divide[j++] = right; } i++; } } template <class Type> void merge(Type source[], Type destination[], int left, int middle, int right) { int i = left; int j = middle + 1; int k = left; while (i <= middle && j <= right) { if (source[i] <= source[j]) { destination[k++] = source[i++]; } else { destination[k++] = source[j++]; } } if (i > middle) { for (; j <= right; j++) { destination[k++] = source[j]; } } else { for (; i <= middle; i++) { destination[k++] = source[i]; } } } int main(int argc, char** argv) { int* a = (int*) malloc(100 * sizeof(int)); int i = 0; while (scanf("%d", &a[i++]) && i < 5) { //do nothing } merge_sort(a, 5); for (i = 0; i < 5; i++) { printf("%d/t", a[i]); } return 0; }