Предположим, у вас есть один массив a[]=1,2,4,6
и второй массив b[]=3,5,7
. Объединенный результат должен иметь все значения, то есть c[]=1,2,3,4,5,6,7
. Слияние должно выполняться без использования функций от <string.h>
.Как объединить два массива, имеющих разные значения в один массив?
ответ
В случае 2, данные массивы сортируются:
while (true):
{
if (a[i] < b[j])
{
c[k] = a[i];
i++;
} else {
c[k] = b[j]
j++
}
k++
}
I, J, K являются индексами и начинаются с нуля. Имейте в виду, что этот код не проверяет длину массива. Также вам нужно сломать его, когда вы достигнете конца обоих массивов. Но с этим легко справиться.
Если массивы не предварительно отсортированы, вы можете просто их конкатенировать и вызвать функцию поиска на них, такую как BubbleSort или QuickSort. Google те.
while (true)? Также, что происходит, когда один индекс выходит за границы? – pbos
Я не скомпилировал и протестировал следующий код, но я достаточно уверен. Я предполагаю, что оба входных массива уже отсортированы. Существует больше работы, чтобы сделать эту общую цель, в отличие от решения только для этого примера. Несомненно, две фазы, которые я идентифицирую, можно объединить, но, возможно, это будет труднее читать и проверять;
void merge_example()
{
int a[] = {1,2,4,6};
int b[] = {3,5,7};
int c[100]; // fixme - production code would need a robust way
// to ensure c[] always big enough
int nbr_a = sizeof(a)/sizeof(a[0]);
int nbr_b = sizeof(b)/sizeof(b[0]);
int i=0, j=0, k=0;
// Phase 1) 2 input arrays not exhausted
while(i<nbr_a && j<nbr_b)
{
if(a[i] <= b[j])
c[k++] = a[i++];
else
c[k++] = b[j++];
}
// Phase 2) 1 input array not exhausted
while(i < nbr_a)
c[k++] = a[i++];
while(j < nbr_b)
c[k++] = b[j++];
}
Я учусь с собой на них момент, так что не принимайте это как идеальное решение, но, может быть, вы можете получить некоторые идеи от того, что я сделал, чтобы решить свои собственные проблемы.
#include <stdio.h>
#include <stdlib.h>
int compare (const void * first, const void * second){
return *(int*)first - *(int*)second ;
}
int main(){
int a[] = {1,2,4,6};
int b[] = {3,5,7};
size_t sizeA =sizeof(a)/sizeof(a[0]);
size_t sizeB = sizeof(b)/sizeof(b[0]);
size_t sizeC = sizeA + sizeB;
/*allocate new array of sufficient size*/
int *c = malloc(sizeof(int)*sizeC);
unsigned i;
/*copy elements from a into c*/
for(i = 0; i<sizeA; ++i){
c[i] = a[i];
}
/*copy elements from b into c*/
for(i = 0; i < sizeB; ++i){
c[sizeA+i] = b[i];
}
printf("array unsorted:\n");
for(i = 0; i < sizeC; ++i){
printf("%d: %d\n", i, c[i]);
}
/*sort array from smallest to highest value*/
qsort(c, sizeC, sizeof(int), compare);
printf("array sorted:\n");
for(i = 0; i < sizeC; ++i){
printf("%d: %d\n", i, c[i]);
}
return 0;
}
Учитывая, что входные массивы уже отсортированы, их можно объединить без необходимости сортировки результата. Это должна быть операция O (N), но вы создали операцию O (N.logN). –
void merge(int *input1, size_t sz1,
int *input2, size_t sz2,
int *output, size_t sz3) {
int i = 0;
int index1 = 0, index2 = 0;
while (i < sz3 && index1 < sz1 && index2 < sz2)
if (input1[index1] <= input2[index2])
output[i++] = input1[index1++];
else
output[i++] = input2[index2++];
if (index1 < sz1)
for (; i < sz3 && index1 < sz1; ++i, ++index1)
output[i] = input1[index1];
else if (index2 < sz2)
for (; i < sz3 && index2 < sz2; ++i, ++index2)
output[i] = input2[index2];
}
который вы используете этот путь:
#define TAB_SIZE(x) (sizeof(x)/sizeof(*(x)))
int tab1[] = { 1, 2, 4, 6 };
int tab2[] = { 3, 5, 7 };
int tabMerged[TAB_SIZE(tab1)+TAB_SIZE(tab2)];
merge(tab1, TAB_SIZE(tab1), tab2, TAB_SIZE(tab2), tabMerged, TAB_SIZE(tabMerged));
я мог бы жить с «input1» и «input2», но не «SZ1», «SZ2» и «SZ3» ... – foraidt
Слияние 2 несортированные целые массивы:
void main()
{
clrscr();
int A[10],B[10],C[26],a,b,n1,n2;
cout<<"\n enter limit for array1 ";
cin>>n1;
cout<<"\n enter limit for array2 ";
cin>>n2;
a=0;b=0;int i=0;
clrscr();
while(1)
{
if(a<n1)
{
cout<<"\n enter element "<<a+1<<"for array1 ";
cin>>A[a];
clrscr();
a++;
}
if(b<n2)
{
cout<<"\n enter element "<<b+1<<"for array2 ";
cin>>B[b]; clrscr();
b++;
}
if(a==n1&&b==n2)
break;
}
a=0;b=0;
cout<<"\n array merged";
while(1)
{
if(a<n1)
{
C[a]=A[a];
a++;
}
if(a>=n1&&b<n2)
{
C[a]=B[b];
a++;b++;
}
if(a==(n1+n2))
{
if(i<(n1+n2))
{
cout<<endl<<C[i];
i++;
}
else
break;
}
}
getch();// \m/
}
Публикация кода С ++ в ответ на вопрос, помеченный С дискуссионный значения. Вопрос никогда не был помечен C++. –
это лишь простая модификация законопроекта способствует ответы, которые будут принимать н измерение массив:
int main(void)
{
int m,n;
int c[100];
printf("Enter Size of first Array: \n");
scanf("%d",&m);
printf("Enter Size of Second Array: \n");
scanf("%d",&n);
int a[m],b[n]; //Declaring array a and b with its size m and n accordingly
int myval=m+n; //Size of the new array
for(int i=0;i<m;i++){
printf("Enter value for first[%d]:",i);
scanf("%d",&a[i]);
}
for(int i=0;i<m;i++){
printf("Enter value for Second[%d]:",i);
scanf("%d",&b[i]);
}
int nbr_a = sizeof(a)/sizeof(a[0]); //this gives the actual size of an array
int nbr_b = sizeof(b)/sizeof(b[0]);
int i=0, j=0, k=0;
// Phase 1) 2 input arrays not exhausted
while(i<nbr_a && j<nbr_b)
{
if(a[i] <= b[j])
c[k++] = a[i++];
else
c[k++] = b[j++];
}
// Phase 2) 1 input array not exhausted
while(i < nbr_a)
c[k++] = a[i++];
while(j < nbr_b)
c[k++] = b[j++];
for(i=0;i<myval;i++){
printf("c[%d]:%d\n",i,c[i]);
}
}
Не является ли 'nbr_a' таким же, как' m' и 'nbr_b' таким же, как' n'? И разве это не ошибка, в которую вы вводите 'm' вместо значений' n' в 'b'? –
- 1. Как объединить два массива в один массив?
- 2. Как объединить значения массива в один массив?
- 3. Как объединить два массива, где один массив динамических вложенными значения
- 4. объединить два массива в один массив
- 5. Объединить два массива в один
- 6. Как объединить два массива в один двумерный массив?
- 7. , как объединить два массива в один массив в PHP
- 8. Как объединить два массива в один массив в angularjs?
- 9. Как объединить два массива в один массив в javascript?
- 10. Объединить два массива в один объект Json
- 11. Как объединить два смежных элемента XML, имеющих один класс?
- 12. Как объединить два массива в один многомерный массив
- 13. Как объединить эти два массива в один массив, используя php?
- 14. Как объединить два массива отрицательных чисел в один массив?
- 15. объединить два массива в один на куски
- 16. Как объединить два буфера массива в один?
- 17. титана мобильный: объединить два массива в один массив вопрос
- 18. Как слить два массива в один массив?
- 19. объединить два массива в третий массив
- 20. Объединить и отсортировать два массива int в один массив int
- 21. объединить два значения из массива в PHP
- 22. PHP, объединить два массива в новый массив
- 23. Объединить два массива, чтобы один массив с общим значением
- 24. Как объединить два массива?
- 25. Как объединить два массива?
- 26. объединить два массива в ассоциативный массив, проблемы
- 27. Как объединить два массива?
- 28. Объединить два массива в один Иос
- 29. объединить два значения массива в Matlab
- 30. Как объединить эти два массива?
duplicate http://stackoverflow.com/questions/1696074/how-can-i-concatenate-two-arrays-in-c – Naveen
osama Вы можете редактировать старый вопрос, а не отправлять новый. – 2009-11-09 10:33:20
Не дубликат. В другом вопросе осама (предположительно) спросил о конкатенации; этот вопрос связан с объединением двух упорядоченных массивов. – Thomas