数据结构_just_sort

本文探讨了一种算法,用于解决两个序列的问题:一个是乱序并含有缺失值的序列,另一个是有序序列。通过特定的排序及填充策略,判断是否能构成单调递增序列,并输出最终结果。

问题描述

给定两个序列 a b,序列 a 原先是一个单调递增的正数序列,但是由于某些
原因,使得序列乱序了,并且一些数丢失了(用 0 表示)。经过数据恢复后,找
到了正数序列 b ,且序列 a 0 的个数等于序列 b 的个数,打算使用序列 b
复序列 a
对于序列 a 来说,我们可以交换两个位置上的非零的数,并且可以交换任意
次。序列 b 同样也可以进行任意次交换。
现在要将序列 b 填充到序列 a 中的值丢失的位置上,序列 b 中的每个数只能
填充一次,问最后构成的序列是否是单调递增的,如果是,则输出填充后的序列,
否则输出-1


★数据输入
输入给定 N M, 表示序列 a 和序列 b 的长度。 第一行为序列 a ,第二行为
序列 b。 题目保证除了 0 以外的数,在序列 a b 中只出现一次。
数据保证:
80%的数据, N, M <= 100
100%的数据, N, M <= 100000, 0 <= a[i] <= 100000, 0 < b[i] <= 100000


★数据输出
如果最后序列 a 是单调递增的,输出该序列,否则输出-1

输入示例 输出示例
4 2
0 11 0 15
1 12
1 11 12 15


输入示例 输出示例
4 2
0 0 11 15
1 12
-1


思路:

  用三个数组:

    用 a0[ ] 存输入的序列a

    用 a[ ] 存序列a中不带0的元素

    用b[ ] 存序列b

  用归并对 a[ ] 与b[ ]排序 (由于数据<=100000的原因,用计数排序会更快O(n) ;不用快排是最坏会O(n^2),怕OJ故意出比较坑的数据)

  将a[ ] 与b[ ]插入a0[ ] ,检测是否可行

 

code

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 int buf[100001]={0};
 5 
 6 inline int max(int a,int b)
 7 {
 8     return a>b?a:b;
 9 }
10 
11 void mergesort(int *p,int l,int r)
12 {
13     if(l>=r) return;
14     if(l+1==r)
15     {
16         if(p[l]>p[r])
17         {
18             p[l]^=p[r];
19             p[r]^=p[l];
20             p[l]^=p[r];
21         }
22         return;
23     }
24     int i,j,k;
25     int m = (l+r)/2;
26     mergesort(p,l,m);
27     mergesort(p,m+1,r);
28     for(i=l; i<=r; i++) buf[i]=p[i];
29     for(k=l,i=l,j=m+1; k<=r; k++)
30     {
31         if(i>m)                 p[k]=buf[j++];
32         else if(j>r)            p[k]=buf[i++];
33         else if(buf[i]<buf[j])    p[k]=buf[i++];
34         else                    p[k]=buf[j++];
35     }
36 }
37 
38 int main()
39 { 
40     int i,j,k;
41     int a_len=0;
42     int a0_len,b_len,tmp;
43     scanf("%d %d",&a0_len,&b_len);
44     int *a0 = (int *)malloc(sizeof(int)*a0_len);
45     int *a = (int *)malloc(sizeof(int)*a0_len);
46     int *b = (int *)malloc(sizeof(int)*b_len);
47     //--------------------------------------------------------
48     for(i=0; i<a0_len; i++)
49     {
50         scanf("%d",a0+i);
51         if(a0[i]!=0)
52         {
53             a[a_len++]=a0[i];
54         }
55     }
56     for(i=0; i<b_len; i++)
57     {
58         scanf("%d",b+i);
59     }
60     mergesort(a,0,a_len-1);
61     mergesort(b,0,b_len-1);
62     
63     bool flag = true;
64     for(i=0,j=0,k=0; k<a0_len; k++)
65     {
66         if(a0[k]==0)
67         {
68             a0[k]=b[j++];
69         }
70         else
71         {
72             a0[k]=a[i++];
73         }
74         if(k!=0 && a0[k]<a0[k-1])
75         {
76             flag = false;
77             break;
78         }
79     }
80         
81 
82     if(flag)
83     {
84         for(i=0;i<a0_len;i++)
85         {
86             printf("%d ",a0[i]);
87         }
88     }
89     else
90     {
91         printf("-1");
92     }
93     printf("\n");
94     //--------------------------------------------------------
95     free(a);
96     free(b);
97     free(a0);
98     return 0;
99 }

 

转载于:https://www.cnblogs.com/cbattle/p/7733441.html

### 数据结构算法的学习方法 学习数据结构算法是提升编程能力的重要途径之一。通过掌握这些核心概念,可以更高效地解决实际问题并优化程性能[^1]。 #### 推荐的教程和资料 以下是几类适合初学者到进阶者的数据结构算法学习资源: 1. **书籍推荐** - 《从零开始学习数据结构算法:Python实现》是一本非常适合新手入门的教材,它详细介绍了如何利用 Python 实现各种常见的数据结构算法。 - 另一本经典著作《Introduction to Algorithms》,通常被称为 CLRS(四位作者姓氏首字母),提供了全面而深刻的理论讲解,适用于希望深入了解算法原理的人群[^2]。 2. **在线课程平台** 许多知名教育网站提供高质量的数据结构算法课程,例如 Coursera、edX 和 Udemy 上都有专门针对不同水平学员开设的相关项目。此外,“LeetCode”作为全球范围内广受认可的技术面试准备工具,在其中不仅能够找到大量练习题目,还包含了详细的解题思路分析[^3]。 3. **实践平台** 动手操作始终是最有效的学习手段之一。建议期参像 HackerRank 或 Codeforces 这样的竞技编码比赛来锻炼自己的实战技巧。同时也可以尝试完成 LeetCode 平台上按照难度分级布置的任务清单,逐步积累经验。 4. **社区交流** 加入 GitHub Discussions 或 Stack Overflow 等技术论坛可以帮助解答疑惑并通过其他开发者互动获得灵感启发。 ```python def example_algorithm(): """ A simple function demonstrating an algorithmic concept. This is just a placeholder and does not represent any specific algorithm. """ array = [5, 3, 8, 6, 2] sorted_array = sorted(array) # Example of using built-in sort as part of learning algorithms return sorted_array print(example_algorithm()) ``` 上述代码展示了一个简单的例子函数 `example_algorithm` ,用于演示排这一基本算法的概念。虽然这里使用的是 Python 的内置排功能,但在学习过程中应该探索其实现细节及其背后的机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值