Jak złączyć 2 tablice posortowane niemalejąco w jedn,ą zapisując do tablicy trzeciej.....
dostajemy 2 posortowane, i wynikiem ma być trzecia tablica także posortowana składająca się z 2 poprzednich
Nie wiem jak to zrobić
Iterujesz po obu, kopiując mniejszy element, aż do końca obu tablic. Inkrementujesz tylko wskaźnik tej, z której skopiowałeś.
http://stackoverflow.com/a/19719407
Tutaj zakładają, że tablice mają ten sam rozmiar, ale nie powinno być problemem zmiana, by te początkowe tablice miały różne rozmiary.
zrobiłem ale sie program zawiesza :(
#include <stdio.h>
#define n_1 2
#define n_2 3
void merge(int tab1[], int tab2[], int tab3[], int amount)
{
int amount_t1 = 0, amount_t2 = 0;
int i = 0, j;
while (tab1[i++] != '\0')
++amount_t1;
i = 0;
while (tab2[i++] != '\0')
++amount_t2;
if (amount_t1 > amount_t2) {
for (i = 0; i < amount_t2; ++i)
if (tab1[i] < tab2[i] || tab1[i] == tab2[i])
tab3[i] = tab1[i];
for (i = 0; i + amount_t2 < amount; ++i)
tab3[i] = tab1;
}
else {
for (i = 0; i < amount_t1; ++i)
if (tab1[i] < tab2[i] || tab1[i] == tab2[i])
tab3[i] = tab1[i];
for (i = 0; i + amount_t1 < amount; ++i)
tab3[i] = tab2;
}
for (i = 0; i < 5; ++i)
printf("%d\t", tab3[i]);
}
int main(int argc, char* argv[])
{
int amount = n_1 + n_2;
int tab1[n_1] = { 2, 4 };
int tab2[n_2] = { 1, 3, 7 };
int tab3[n_1 + n_2];
merge(tab1, tab2, tab3, amount);
return 0;
Tablice nie są zakończone zerem. C-stringi są. Musisz przekazać wielkości tablic do funkcji.
no i wykodziłe, mogłem zajrzeć wcześniej do wykładu ;-; ,rozumiem o co chodziło z tymi wskażnikami
No i jest probem, bo działa poprawnie ale nie jak tablice są różnej długości
#include <stdio.h>
#define n_1 3
#define n_2 2
void merge(int tab1[], int tab2[], int tab3[], int n1, int n2)
{
int amount = n1 + n2;
int i = -1;
int *W1 = tab1, *W2 = tab2; //dlaczego jak wpisywałem &tab1 to program się wkurzał ? to jest uzyskanie adresu adresu tablicy?
while (++i < amount) {
if(*W1 == *W2) {
tab3[i] = *W1;
++*W1;
++*W2;
}
if (*W1 > *W2) {
tab3[i] = *W2;
++W2;
}
else {
tab3[i] = *W1;
++W1;
}
}
for (i = 0; i < 5; ++i)
printf("%d\t", tab3[i]);
}
int main(int argc, char* argv[])
{
int amount = n_1 + n_2;
int tab1[n_1] = { 2, 2, 5 };
int tab2[n_2] = { -5, 4 };
int tab3[n_1 + n_2];
merge(tab1, tab2, tab3, n_1, n_2);
return 0;
}
//tutaj musi być warunek az do wyczerpania jakies tablicy ale nie wiem jak to zrobic ->
#include <stdio.h>
#define n_1 3
#define n_2 2
void merge(int tab1[], int tab2[], int tab3[], int n1, int n2)
{
int amount = n1 + n2, end_Ofsmaller;
int i = -1;
int *W1 = tab1, *W2 = tab2, *longer;
if(n1 > n2) end_Ofsmaller = n2;
else end_Ofsmaller = n1;
for( i = 0; i < end_Ofsmaller; ++i) {// tutaj musi być warunek az do wyczerpania jakies tablicy ale nie wiem jak to zrobic
if(*W1 == *W2) {
tab3[i] = *W1;
++*W1;
++*W2;
}
if (*W1 > *W2) {
tab3[i] = *W2;
++W2;
}
else {
tab3[i] = *W1;
++W1;
}
}
if(end_Ofsmaller == n2 )
while (++end_Ofsmaller < amount)
tab3[end_Ofsmaller] = tab1[end_Ofsmaller];
else
while (++end_Ofsmaller < amount)
tab3[end_Ofsmaller] = tab2[end_Ofsmaller];
for (i = 0; i < amount; ++i)
printf("%d\t", tab3[i]);
}
int main(int argc, char* argv[])
{
int amount = n_1 + n_2;
int tab1[n_1] = { 2, 2, 5 };
int tab2[n_2] = { -5, 4 };
int tab3[n_1 + n_2];
merge(tab1, tab2, tab3, n_1, n_2);
return 0;
}
"//dlaczego jak wpisywałem &tab1 to program się wkurzał ? to jest uzyskanie adresu adresu tablicy?" - bo nazwa tablicy to wskaźnik na jej pierwszy element, jak dasz &tab1 to tak jakbyś chciał wyłuskać adres wskaźnika (podwójny wskaźnik).
Jak nie wiesz dlaczego źle złącza ci tablice o różnych rozmiarach to sobie wypisz jakie kolejne wartości przyjmują zmienne pod adresami W1 i W2:
2 -5 (2 > -5)
2 4 ( 2 < 4)
2 4 (2 < 4)
5 4 (5 > 4)
5 2 (5 > 2)
czyli zgodnie z działaniem tego programu wpisze ci do tablicy kolejno: -5, 2, 2, 4, 2.
Jak widać takie porównania nie za bardzo działają dla tablic o różnych rozmiarach.
A czy nie lepiej jest zamiast inicjalizować zmienną iteracyjną int i
jedną dla wszystkich pętli w ten sposób:
int i;
for (i=0; ...){
...
}
for(i=0;...){
...
}
, inicjalizować int i
dla każdej pętli z osobna w ten sposób:
for (int i=0; ....){
...
}
for (int i=0; ....){
...
}
?
Ten drugi "nawyk" wydaje mi się dużo lepszy.
memcpy.