#include<stdio.h> #include<stdlib.h> #define MAX 500001 int array[MAX], array1[MAX]; __int64 sum; void MergeSort(int, int); void Merge(int, int, int);
int main() { int n, m, i, j = 0; while (1) { sum = 0; scanf("%d", &m); if (m == 0) { break; } for (i = 0; i < m; i++) { scanf("%d", &array[i]); } MergeSort(0, m - 1); printf("排序结果\n"); for (i = 0; i < m; i++) { printf("%d\t", array[i]); } } system("pause"); return 0; }
void MergeSort(int i, int j) { int h; if (i < j) { /**//* 将长度为m的输入序列分成两个长度为n/2的子序列 */ h = (i + j)/2; printf("i = %d h = %d j = %d\n", i, h, j); /**//* 对两个子序列分别进行归并排序 */ MergeSort(i, h); MergeSort(h + 1, j); /**//* 将2个排好的子序列合并成最终有序序列 */ Merge(i, h, j); } } void Merge(int i, int h, int j) { int k = 0, y = h + 1, x = i; /**//* 2个输入区间都不为空时 */
while (x <= h && y <= j) { /**//* 取关键字小的记录转移至输出区间 */
if (array[x] > array[y]) { array1[k++] = array[y++]; sum += h - x + 1; } else { array1[k++] = array[x++]; } } /**//* 将非空的输入区间转移至输出区间 */ while (x <= h) { array1[k++] = array[x++]; } while (y <= j) { array1[k++] = array[y++]; } /**//* 归并完成后将结果复制到原输入数组 */
printf("当前结果\n"); for(x = 0; x < k; x++) { array[i + x] = array1[x]; printf("%d ", array[i + x]); } printf("\n"); } /**//* 6 1 2 5 6 3 4
*/
|