(1)问题描述
对于无序正整数序列,写程序用归并排序算法将其排序成按值非递减有序序列。
(2)输入描述
文本文件“input.txt”中保存了n个测试用例,文件以-1结束。每个用例的第一行m表示待排序正整数序列的元素个数,第二行为该序列的m个正整数。
(3)输出描述
输出结果保存在文本文件“output.txt”中。对于每个测试用例均有二行输出,第一行输出“Case #:##”,#表示用例的编号(1…n),##表示排序后有序序列的元素个数,第二输出##个按值非递减有序元素。
(4)输入示例
5
10 1 8 4 30
7
35 60 50 2 20 4 86
3
38 100 45
-1
(5)输出示例
Case 1:5
4 8 10 30
Case 2:7
2 4 20 35 50 60 86
Case 3:3
38 45 100
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void Merge(int* arr, int left, int right, int mid)
{
int* p = (int*)malloc((right - left + 1) * sizeof(int));
int* temp = p;
memset(p, 0, (right - left + 1) * sizeof(int));
int L = left;
int R = mid + 1;
while (L <= mid && R <= right)
{
*p++ = arr[L] < arr[R] ? arr[L++] : arr[R++];
}
while (L <= mid)
{
*p++ = arr[L++];
}
while (R <= right)
{
*p++ = arr[R++];
}
memcpy(arr + left, temp, (right - left + 1) * sizeof(int));
free(temp);
temp = NULL;
}
void MergeSort(int* arr, int left, int right)
{
if (left == right)
return;
int mid = left + ((right - left) >> 1);
MergeSort(arr, left, mid); //左半边
MergeSort(arr, mid + 1, right); //右半边
Merge(arr, left, right, mid); //排序
}
int main()
{
FILE* fin = fopen("D:\\6-input.txt", "r");
FILE* fout = fopen("D:\\62-output.txt", "w");
int N; //数组中的元素个数
int a[5000];
int count = 0;//记录一共有多少组数
int i, j;
while (true)
{
fscanf(fin, "%d", &N);
if (N == -1) break;//文件以-1结束
count++;
fprintf(fout, "case %d:%d\n", count, N);
for (i = 0; i < N; i++)
{
fscanf(fin, "%d", &a[i]);
}
MergeSort(a, 0, N - 1);
for (j = 0; j < N; j++)
{
fprintf(fout, "%d ", a[j]);
}
fprintf(fout, "\n");
}
fclose(fin);
fclose(fout);
system("pause");
}
运行结果:
离了个大谱!!和堆排序一样,几千组数据完全可以成功实现,但是题目里的3组测试样例一直运行有问题,不知道哪里错了,没耐心了不管了随便吧毁灭吧qaq
算法分析:
时间复杂度O(nlogn)
空间复杂度 O(n)