Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помоги с упрощением алгоритма, Довольно сложный алгоритм )) 
:(
    Опции темы
Oleg_Ci
Дата 10.9.2006, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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;
}

PM MAIL   Вверх
Oleg_Ci
Дата 12.9.2006, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 3
Всего: 30



Простите, не туда записал

Всё удалил... smile 

Это сообщение отредактировал(а) Олег4 - 12.9.2006, 18:02
PM MAIL   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0424 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.