问题标题: 酷町堂:3900归并数组

0
0
已解决
李泽远
李泽远
高级天翼
高级天翼

#include<bits/stdc++.h>
using namespace std;
long long a[1000001],m,n,b[1000001],s[2000002],C;
int main()
{
    cin>>m;
    for(int i=0;i<m;i++)
    {
        cin>>a[i];
        s[C]=a[i];
        C++;
    }
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>b[i];
        s[C]=b[i];
        C++;
    }
    sort(s,s+C);
    for(int i=0;i<C;i++)
    {
        cout<<s[i]<<" ";
    }
    return 0;
}

李泽远在2019-08-17 15:13:45追加了内容

60分???Time Limit Exceeded???

请给出错误点。

李泽远在2019-09-07 20:51:05追加了内容

请给出桶排的做法?

我试了用桶排,RE!


0
已采纳
赵逸凡
赵逸凡
初级启示者
初级启示者

如果是平时刷题的话建议用加速头文件了解一下,如果是作业老师肯定不给用加速头。

而你后来说RE,桶排的话数值要保证不越界!(打错了,longlong32位)

Ad1:可以使用插入排序,尤其是题目保证“从小到大排序好的”情况下,直接插入排序相较于插入的O(n)要快O(1)左右。

Ad2:Quicklysort和STLsort最坏情况都在题中出现了,所以最好不要用sort。而直接插入O(n-1)还是太慢了。

Ad3:堆排我没学,但是堆排的O(log(n))很值得考虑,完全二叉树是会延伸子节点的,所以万一n是奇数就慢了。

Ad4:希尔排序O()左右,比Ad1要快,但适用于中等数据结构排序。归并sort不适用于有序数组。

Ad5:桶排或基数排序都很适用于此题,最坏O(n)值得你考虑!

Ad6:基数排序时间复杂度大于计数排序Ο(n+k),计数排序牺牲空间换时间,在m,n<1000000的情况不大建议。

Ad7:二分O(n/2)我就不说了,根本几乎没用。

综上所述,自己选择吧!

0
0
0
0
董子墨
董子墨
中级天翼
中级天翼

这题sort不够快,要用桶。桶也要统计出最大数,以便输出更快,不然也会超时。

董子墨在2019-08-17 16:34:29追加了内容

望采纳

0
李明翰
李明翰
新手光能
新手光能

我将所有排序都和你讲,良心回答,你自己考虑

1.插入排序的时间复杂度最好的情况是已经是正序的序列,只需比较(n-1)次,时间复杂度为O(n),最坏的情况是倒序的序列,要比较n(n-1)/2次,时间复杂度为O(n^2 ) ,平均的话要比较时间复杂度为O(n^2 )

插入排序是一种稳定的排序方法,排序元素比较少的时候很好,大量元素便会效率低下

2.

冒泡排序感觉非常好理解,第一个for循环是遍历所有元素,第二个for循环是每次遍历元素时都对无序区的相邻两个元素进行一次比较,若反序则交换

时间复杂度最坏的情况是反序序列,要比较n(n-1)/2次,时间复杂度为O(n^2 ),最好的情况是正序,只进行(n-1)次比较,不需要移动,时间复杂度为O(n),而平均的时间复杂度为O(n^2 )

3.快速排序时间复杂度的最好情况和平均情况一样为O(nlog2 n),最坏情况下为O(n^2 ),这个看起来比前面两种排序都要好,但是这是不稳定的算法,并且空间复杂度高一点( O(nlog2 n)
而且快速排序适用于元素多的情况

4.

堆的结构类似于完全二叉树,每个结点的值都小于或者等于其左右孩子结点的值,或者每个节点的值都大于或等于其左右孩子的值

堆排序过程将待排序的序列构造成一个堆,选出堆中最大的移走,再把剩余的元素调整成堆,找出最大的再移走,重复直至有序

堆排序的时间复杂度最好到最坏都是O(n log n),较多元素的时候效率比较高

5.归并排序的基本思想是将若干个序列进行两两归并,直至所有待排序记录都在一个有序序列为止

归并排序的时间复杂度都是O(n log n),并且适用于元素较多的时候排序

求采纳,谢谢

李明翰在2019-08-18 12:27:51追加了内容

6.桶排序可以说是最快最简单的排序,下面非常详细的和你讲

桶排序算法要求,数据的长度必须完全一样,程序过程要产生长度相同的数据,使用下面的方法:Data=rand()/10000+10000上面提到的,每次下一次的扫描顺序是按照上次扫描的结果来的,所以设计上提供相同的两个桶数据结构。前一个保存每一次扫描的结果供下次调用,另外一个临时拷贝前一次扫描的结果提供给前一个调用。

数据结构设计:链表可以采用很多种方式实现,通常的方法是动态申请内存建立结点,但是针对这个算法,桶里面的链表结果每次扫描后都不同,就有很多链表的分离和重建。如果使用动态分配内存,则由于指针的使用,安全性低。所以,笔者设计时使用了数组来模拟链表(当然牺牲了部分的空间,但是操作却是简单了很多,稳定性也大大提高了)。共十个桶,所以建立一个二维数组,行向量的下标0—9代表了10个桶,每个行形成的一维数组则是桶的空间。

平均情况下桶排序以线性时间运行。像基数排序一样,桶排序也对输入作了某种假设, 因而运行得很快。具 体来说,基数排序假设输入是由一个小范围内的整数构成,而桶排序则 假设输入由一个随机过程产生,该过程将元素一致地分布在区间[0,1)上。 桶排序的思想就是把区间[0,1)划分成n个相同大小的子区间,或称桶,然后将n个输入数分布到各个桶中去。因为输入数均匀分布在[0,1)上,所以一般不会有很多数落在一个桶中的情况。为得到结果,先对各个桶中的数进行排序,然后按次序把各桶中的元素列出来即可。

在桶排序算法的代码中,假设输入是含n个元素的数组A,且每个元素满足0≤ A[i]<1。另外还需要一个辅助数组B[O..n-1]来存放链表实现的桶,并假设可以用某种机制来维护这些表。

求采纳,谢谢

李明翰在2019-08-18 12:30:31追加了内容

说简单点,你这题错的原因是不够快,所以用桶排序和归并排序,毕竟他题目就是归并排序,而桶排序很快

我要回答