Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по информатике.doc
Скачиваний:
78
Добавлен:
02.05.2014
Размер:
1.53 Mб
Скачать

Поиск заданного элемента в массиве

Последовательный поиск элемента

Необходимо запустить цикл повторений, который станет просматривать все элементы один за другим до тех пор, пока нужный элемент не будет найден, либо пока не будут пройдены все его элементы.

#include <iostream.h>

#include <conio.h>

int Search(int array[], int N, int Number)

{

int i = 0;

while (i!=N)

if (array[i]==Number) return i; else i++;

return -1; }

main()

{

int i, Size, Numerals[1000], Number, P;

соut<<"Введите размерность массива! "<<endl;

cin>>Size;

cout<<" Введите элементы массива! "<<endl;

for (i=0; i<Size; i++)

cin>>Numerals[i];

cout<<"Введите число для поиска! "<<endl;

cin>>Number;

P=Search (Numerals, Size, Number);

if (P==-l)

cout<<"No"; else cout<<"Yes "<<P+l;

getch();

return 0;

}

Двоичный (бинарный) поиск

Если у нас есть массив, содержащий упорядоченную последовательность данных, то очень эффективен двоичный поиск.

Переменные Left и Right содержат, соответственно, левую и правую границы отрезка массива, где находится нужный нам элемент. Мы начинаем всегда с исследования среднего элемента отрезка. Если искомое значение меньше среднего элемента, мы переходим к поиску в верхней половине отрезка, где все элементы меньше только что проверенного. Таким образом, в результате каждой проверки мы вдвое сужаем область поиска. Так, в нашем примере, после первой итерации область поиска – всего лишь три элемента, после второй остается всего лишь один элемент. Таким образом, если длина массива равна 6, нам достаточно трех итераций, чтобы найти нужное число.

Двоичный поиск - очень мощный метод. Если, например, длина массива равна 1023, после первого сравнения область сужается до 511 элементов, а после второй - до 255. Легко посчитать, что для поиска в массиве из 1023 элементов достаточно 10 сравнений.

#include <iostream.h>

#include <conio.h>

int Binary_Search(int array[], int N, int Number)

{

int Left, Right, Middle;

Left=0;

Right=N-1;

Middle=(Left+Right)/2;

while (Left<=Right)

{

if (array[Middle]==Number) return Middle;

if (array [Middle]>Number) Right=Middle-l;

else Left=Middle+l;

Middle=(Left+Right)/2; }

return -1; }

main()

{

int i, Size, Numerals[100000], Number, Pos;

cout<<"Введите размер массива! "<<endl;

cin>>Size;

for (i=0; i<Size; i++)

Numerals[i]=i;

cout<<"Введите число для поиска! "<<endl;

cin>>Number;

Pos=Binary_Search(Numerals,Size,Number);

if (Pos==-1)

cout<<"Число в массиве отсутствует";

else cout<<"Число находится в позиции: "<<Pos;

getch();

return 0;

}

Указатели

Указатель – адрес памяти, распределяемой для размещения идентификатора (идентификатор – имя переменной, массива, структуры, строкового литерала). Если переменная объявлена как указатель, то она содержит адрес памяти, по которому может находиться скалярная величина любого типа.

При работе с указателями действуют следующие правила:

  • при объявлении переменной-указателя перед именем переменной указывается операция *;

  • если одним оператором объявляется несколько переменных-указателей, то перед каждой такой переменной следует указывать операцию *;

  • после объявления указателя его следует инициализировать адресом значения того же типа, что и тип указателя;

  • для получения адреса переменной перед ее именем указывается операция взятия адреса &;

  • для получения значения переменной по указателю на нее перед указателем ставится операция разыменования * (называемая иногда операцией взятия значения);

  • указатель строки содержит адрес первого символа строки;

  • при увеличении указателя на единицу значение, содержащееся в переменной-указателе, увеличивается на число байт, которое отведено под переменную данного типа.