洛谷 P1177 【模板】排序 (Merge Sort排序)

题目描述

将读入的 N 个数从小到大排序后输出。

输入格式

第一行为一个正整数 N。

第二行包含 N 个空格隔开的正整数 ai​,为你需要进行排序的数。

输出格式

将给定的 N 个数从小到大输出,数之间空格隔开,行末换行且无空格。

输入输出样例

输入 #1

5
4 2 4 5 1

输出 #1

1 2 4 4 5

说明/提示

对于 20% 的数据,有 1≤N≤10^3;

对于 100%的数据,有 1≤N≤10^5,1≤ai≤10^9。

完整代码如下:

代码分析

  1. mergee函数:这是一个用于合并两个已排序的子数组的函数。输入是两个数组(ab)的头和尾的索引。这个函数首先检查是否可以在不进行分割的情况下直接返回,如果可以,则直接返回。然后,它找到中间索引,并开始从两个数组的开头同时读取元素,将较小的元素放入b数组。如果一个数组的元素被完全读取了,而另一个数组还有剩余元素,那么它将剩余的元素都放入b数组。最后,它将b数组中的元素复制回a数组。
  2. merge_sort函数:这是主要的排序函数。它首先检查输入的数组是否需要进一步分割。如果需要,它将数组分割成两个子数组,然后对每个子数组递归调用merge_sort函数进行排序。然后,它调用mergee函数将两个已排序的子数组合并成一个已排序的大数组。
  3. main函数:这是程序的入口点。它首先读取要排序的数组的大小,然后读取每个元素的值。然后,它调用merge_sort函数对数组进行排序。最后,它打印出排序后的数组的每个元素。

C语言代码如下

#include <stdio.h>
int a[600001],b[600001];
typedef long long ll;
void mergee(int head, int tail) 
{
	int mid = (head + tail) / 2;//取一个中间值
	int i = head, j = mid + 1, temp = head;  // i是第一个序列的开头,j是第二个序列的开头,tot是整个的大序列。
	while (i <= mid && j <= tail) {  //合并
		b[temp++]=a[i] <= a[j] ? a[i++]:a[j++];
	}
	while (i <= mid) {  //可能还没有放完,就把剩下的放进来。
		b[temp++] = a[i++];
	}
	while (j <= tail) {  // 同上
		b[temp++] = a[j++];
	}
	for (int i = head; i <= tail; i++) {  // 给最终的答案数组赋值。
		a[i] = b[i];
	}
	return;
}
void merge_sort(int head,int tail) 
{
	if (head < tail) 
	{
		int mid = (head + tail) / 2;
		merge_sort(head, mid);  //  先给左子序列排序。
		merge_sort(mid + 1, tail); //再给右子序列排序。
		mergee(head,tail);  // 最后把两个子序列合并。
	}
	return ;
}
int main() 
{
	int n,i;
	scanf("%d",&n);
	for (i = 1; i <= n; i++) {
		scanf("%d",&a[i]);
	}
	merge_sort(1, n);
	for (i=1;i<=n;i++){
		printf("%d ",a[i]);
	}
	return 0;
}

以下是几种排序算法的时间复杂度和空间复杂度的比较:

  1. 选择排序(Selection Sort)
    时间复杂度:O(n^2),其中n是待排序数组的长度。
    空间复杂度:O(1),不需要额外的存储空间。
  2. 冒泡排序(Bubble Sort)
    时间复杂度:O(n^2),其中n是待排序数组的长度。
    空间复杂度:O(1),不需要额外的存储空间。
  3. 快速排序(Quick Sort)
    时间复杂度:平均O(n log n),最坏情况下O(n^2)。
    空间复杂度:平均O(log n),最坏情况下O(n)。这是因为快速排序使用了递归调用,需要额外的存储空间来保存递归调用的堆栈。
  4. 归并排序(Merge Sort)
    时间复杂度:O(n log n),其中n是待排序数组的长度。
    空间复杂度:O(n),因为归并排序需要额外的存储空间来保存合并过程中的临时数组。
  5. 堆排序(Heap Sort)
    时间复杂度:O(n log n),其中n是待排序数组的长度。
    空间复杂度:O(1),不需要额外的存储空间。堆排序只需要常数级别的额外空间。

总结:在时间复杂度方面,快速排序和堆排序具有较好的性能,通常优于其他算法。在空间复杂度方面,堆排序和选择排序具有较好的性能,只需要常数级别的额外空间。然而,实际应用中需要根据具体的数据和需求来选择合适的排序算法。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值