题目描述
将读入的 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。
完整代码如下:
代码分析
mergee
函数:这是一个用于合并两个已排序的子数组的函数。输入是两个数组(a
和b
)的头和尾的索引。这个函数首先检查是否可以在不进行分割的情况下直接返回,如果可以,则直接返回。然后,它找到中间索引,并开始从两个数组的开头同时读取元素,将较小的元素放入b
数组。如果一个数组的元素被完全读取了,而另一个数组还有剩余元素,那么它将剩余的元素都放入b
数组。最后,它将b
数组中的元素复制回a
数组。merge_sort
函数:这是主要的排序函数。它首先检查输入的数组是否需要进一步分割。如果需要,它将数组分割成两个子数组,然后对每个子数组递归调用merge_sort
函数进行排序。然后,它调用mergee
函数将两个已排序的子数组合并成一个已排序的大数组。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;
}
以下是几种排序算法的时间复杂度和空间复杂度的比较:
- 选择排序(Selection Sort)
时间复杂度:O(n^2),其中n是待排序数组的长度。
空间复杂度:O(1),不需要额外的存储空间。 - 冒泡排序(Bubble Sort)
时间复杂度:O(n^2),其中n是待排序数组的长度。
空间复杂度:O(1),不需要额外的存储空间。 - 快速排序(Quick Sort)
时间复杂度:平均O(n log n),最坏情况下O(n^2)。
空间复杂度:平均O(log n),最坏情况下O(n)。这是因为快速排序使用了递归调用,需要额外的存储空间来保存递归调用的堆栈。 - 归并排序(Merge Sort)
时间复杂度:O(n log n),其中n是待排序数组的长度。
空间复杂度:O(n),因为归并排序需要额外的存储空间来保存合并过程中的临时数组。 - 堆排序(Heap Sort)
时间复杂度:O(n log n),其中n是待排序数组的长度。
空间复杂度:O(1),不需要额外的存储空间。堆排序只需要常数级别的额外空间。
总结:在时间复杂度方面,快速排序和堆排序具有较好的性能,通常优于其他算法。在空间复杂度方面,堆排序和选择排序具有较好的性能,只需要常数级别的额外空间。然而,实际应用中需要根据具体的数据和需求来选择合适的排序算法。