归并排序算法C语言实现

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)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值