Sorozatok összefésülése
Értelmezés: összefésülés == két rendezett sorozatból
gyártunk egy harmadik rendezett sorozatot,
mely tartalmazza a két sorozat minden elemét.
Fésüljünk össze két növekvő sorozatot szintén növekvő sorrendbe!
Pl.
bemenet:
1 3 5 2 3 4
kimenet:
1 2 3 3 4 5
Ötlet: két indexszel egyszerre végigjárjuk a sorozatokat
1 3 5 2 3 4
^ ^
i j
eredmény:
1 2 3 3 4 5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
| #include <iostream>
using namespace std;
int main()
{
int n1;
cin >> n1;
int t1[1000];
for(int i = 0; i < n1; i++){
cin >> t1[i];
}
int n2;
cin >> n2;
int t2[1000];
for(int i = 0; i < n2; i++){
cin >> t2[i];
}
int eredmeny[2000];
int c = 0; // hol tartok az eredmeny-ben?
// == hány elemet tettem eddig bele?
int i1 = 0;
int i2 = 0;
while (i1 < n1 && i2 < n2) {
// amíg egyik tömb sem fogyott el
if (t1[i1] <= t2[i2]) {
eredmeny[c] = t1[i1];
i1++;
c++;
}
else {
eredmeny[c] = t2[i2];
i2++;
c++;
}
}
// még át kell másolni a maradékot
// (t1-ből v. t2-ből eredmeny-be)
while (i1 < n1) {
eredmeny[c] = t1[i1];
i1++;
c++;
}
while (i2 < n2) {
eredmeny[c] = t2[i2];
i2++;
c++;
}
// kiírás
for (int i = 0; i < c; i++)
cout << eredmeny[i] << " ";
cout << endl;
return 0;
}
|
Feladatok
1. (HF) Összefésülés két csökkenő sorozatból csökkenő sorrendbe
Megoldás: csak az if-beli <= jelet kell >= jelre cserélni.
2. (HF) Adott két sorozat, az első növekvő, a második csökkenő.
Fésüljük össze az elemeiket növekvő sorrendbe!
Pl.
3 4
1 3 5 4 3 2 1
^ ^
kimenet:
1 1 2 3 3 4 5
Megoldás: ld. az alábbi feladat megoldását (minimális módosítással)
3. (HF) Adott két sorozat, az első csökkenő, a második növekvő.
Fésüljük össze az elemeiket csökkenő sorrendbe!
Pl.
4 3
4 3 2 1 1 3 5
^ ^
kimenet:
5 4 3 3 2 1 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
| #include <iostream>
using namespace std;
int main()
{
int n1;
cin >> n1;
int t1[1000];
for(int i = 0; i < n1; i++){
cin >> t1[i];
}
int n2;
cin >> n2;
int t2[1000];
for(int i = 0; i < n2; i++){
cin >> t2[i];
}
int eredmeny[2000];
int c = 0; // hol tartok az eredmeny-ben?
// == hány elemet tettem eddig bele?
int i1 = 0;
int i2 = n2 - 1;
while (i1 < n1 && i2 >= 0){
if (t2[i2] <= t1[i1]){
eredmeny [c] = t1 [i1];
i1++;
c++;
}
else {
eredmeny [c] = t2 [i2];
i2--;
c++;
}
}
while (i1 < n1) {
eredmeny [c] = t1 [i1];
i1++;
c++;
}
while (i2 >= 0) {
eredmeny [c] = t2 [i2];
i2--;
c++;
}
// kiírás
for (int i = 0; i < c; i++)
cout << eredmeny[i] << " ";
cout << endl;
return 0;
}
|