
Friend
 
Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.
Репутация: 3 Всего: 30
|
| Цитата | | для некоторых целей, мною был создан сложный алгоритм для поиска значений одного массива в другом. Т.е. проверить содержутся ли во 2м массиве элементы первого. До сих пор у меня есть уверенность что сделать всё можно намного проще Помоги упростить это. |
| Код | #include <stdio.h>
void QuickSort( int * a, long N);
int main() { long const sizeA = 10; long const sizeB = 15; int a[ sizeA ] = { 3, 4, 3, 2, 43, 54, 43, 3, 3, 2 }; int b[ sizeB ] = { 3, 2, 43, 54, 4, 3, 2, 21, 45, 3, 23, 2, 3, 3, 32 }; QuickSort( a, sizeA -1 ); QuickSort( b, sizeB -1 );
// поиск значений одного массива (a) в другом (b) int i = 0, j = 0, count = 0; while( i < sizeA && j < sizeB ) { if ( a[i] == b[j] ) { // вывод одинаковых значений printf("a[%d] = %3d == b[%d] = %3d\n", i, a[i], j, b[j] ); i++; j++; count++; } else if ( a[i] < b[j] ) i++; else j++; // ( a[i] > b[j] ) } printf("\n\ncount = %d", count ); // выводим количество найденых элементов
getchar(); return 0; } /////////////////////// END MAIN /////////////////////////////////////////////////////////////
void QuickSort( int * a, long N) // http://algolist.manual.ru/ {// На входе - массив a[], a[N] - его последний элемент.
long i = 0, j = N; // поставить указатели на исходные места int temp, p;
p = a[ N>>1 ]; // центральный элемент
// процедура разделения do { while ( a[i] < p ) i++; while ( a[j] > p ) j--;
if (i <= j) { temp = a[i]; a[i] = a[j]; a[j] = temp; i++; j--; } } while ( i<=j );
// рекурсивные вызовы, если есть, что сортировать if ( j > 0 ) QuickSort(a, j); if ( N > i ) QuickSort(a+i, N-i); }
|
Я вроде понял что надо найти одинаковые числа в двух массивах, и все их собрать в одном массиве (у меня в связанном списке): | Код | #include<stdlib.h> #include <stdio.h>
int intcmp(const void *, const void *); struct number { int x; number * n; }*num, *n;
int main() { long const sizeA = 10; long const sizeB = 15; n = num = NULL; int a[ sizeA ] = { 3, 4, 3, 2, 43, 54, 43, 3, 1, 2 }; int b[ sizeB ] = { 3, 2, 43, 54, 4, 3, 2, 21, 45, 3, 23, 2, 1, 3, 32 }; qsort( a, sizeA, sizeof(int), intcmp ); qsort( b, sizeB, sizeof(int), intcmp );
// поиск значений одного массива (a) в другом (b) int i = 0, j = 0, count = 0; while( i < sizeA && j < sizeB ) { if ( a[i] == b[j] ) { if( n == NULL || n->x != a[i] ) { if ( n == NULL ) num = n = (struct number*) malloc( sizeof( struct number )); else n = n->n = (struct number*) malloc( sizeof( struct number ));
n->x = a[i]; n->n = NULL; count++; } i++; j++; } else if ( a[i] < b[j] ) i++; else j++; // ( a[i] > b[j] ) } printf("count = %d\n\n", count ); // выводим количество найденых элементов
for ( n = num; n!= NULL; n = n->n ) // выводим одинаковые числа printf("number = %d\n", n->x );
getchar(); return 0; } /////////////////////// END MAIN /////////////////////////////////////////////////////////////
int intcmp(const void *a, const void *b) { return *(int *)a - *(int*)b; }
|
|