Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
инфа экзамен / семинарские вопросы.docx
Скачиваний:
157
Добавлен:
23.03.2016
Размер:
100.27 Кб
Скачать

14) Метод прямого выбора и его модификации: сортировка методом поиска минимального/максимального элемента, сортировка методом поиска индекса

Все описываемые далее методы следует рассматривать как частные варианты метода, известного под названием метод прямого выбора или сортировка посредством выбора. Общим для этих методов является нахождение (выбор) максимальных или минимальных элементов массива и размещение их в последовательных ячейках массива.

Сортировка методом поиска минимального элемента.

Суть этого метода (имея в виду выбранные ограничения для рассматриваемого нами числового примера) состоит в следующем. На первом шаге отыскивается и сохраняется в переменной, например, xmin минимальное число среди всех чисел массива и его индекс, сохраняемый в другой переменной, например, imin, а затем проводится обмен местами в массиве найденного минимального числа с нулевым элементом массива: x[imin]=x[0]; x[0]=xmin;.

В общем случае, на любом шаге i, i=0,1, 2, 3, …, n-2, отыскивается xmin - минимальное число среди ячеек массива с индексами от i до n-1 и его индекс imin, а затем проводится обмен местами в массиве найденного минимального числа с i-тым элементом массива: x[imin]=x[i]; x[i]=xmin;

Таким образом, внешний цикл должен выполняться n-1 раз, а число выполнений внутреннего цикла будет уменьшаться от n-1 до 1.

Сортировка методом поиска максимального элемента.

Этот метод отличается от предыдущего только тем, что отыскиваются максимальные элементы. При одинаковой организации циклов при реализации этих методов они дадут прямо противоположные результаты: если один приведёт к возрастанию чисел в массиве, то другой – убыванию, и наоборот.

Сортировка методом поиска индекса минимального элемента.

Этот метод отличается от метода поиска минимального элемента и его индекса тем, что внутренний цикл используется для поиска только индекса элемента, поэтому перестановки чисел в массиве на каждом шаге i, i=0,1, 2, …,n-2 придется выполнять с привлечением дополнительной переменной, например, r: r:=x[i]; x[i]:=x[imin]; x[imin]:=r;.

Сортировка методом поиска индекса максимального элемента.

Этот метод отличается от предыдущего только тем, что отыскиваются индекс максимального элемента. При одинаковой организации циклов при реализации этих методов они дадут прямо противоположные результаты: если один приведёт к возрастанию чисел в массиве, то другой – убыванию, и наоборот.

Исходный код функции:

void SelectionSort(int *input_data, int length) {

for (int i = 0; i < length - 1; i++) {

/* устанавливаем начальное значение минимального индекса */

int min_i = i;

/* находим индекс минимального элемента */

for (int j = i + 1; j < length; j++) {

if (input_data[j] < input_data[min_i]) {

min_i = j;

}

}

/* меняем значения местами */

int temp = input_data[i];

input_data[i] = input_data[min_i];

input_data[min_i] = temp;

}

}

15) Указатели

Указатель – переменная, значением которой является адрес ячейки памяти. То есть указатель ссылается на блок данных из области памяти, причём на самое его начало. Указатель может ссылаться на переменную или функцию. Для этого нужно знать адрес переменной или функции. Так вот, чтобы узнать адрес конкретной переменной в С++ существует унарная операция взятия адреса &. Такая операция извлекает адрес объявленных переменных, для того, чтобы его присвоить указателю.

Указатели используются для передачи по ссылке данных, что намного ускоряет процесс обработки этих данных (в том случае, если объём данных большой), так как их не надо копировать, как при передаче по значению, то есть, используя имя переменной. В основном указатели используются для организации динамического распределения памяти, например при объявлении массива, не надо будет его ограничивать в размере. Ведь программист заранее не может знать, какого размера нужен массив тому или иному пользователю, в таком случае используется динамическое выделение памяти под массив. Любой указатель необходимо объявить перед использованием, как и любую переменную.

Принцип объявления указателей такой же, как и принцип объявления переменных. Отличие заключается только в том, что перед именем ставится символ звёздочки *. Визуально указатели отличаются от переменных только одним символом. При объявлении указателей компилятор выделяет несколько байт памяти, в зависимости от типа данных отводимых для хранения некоторой информации в памяти. Чтобы получить значение, записанное в некоторой области, на которое ссылается указатель нужно воспользоваться операцией разыменования указателя *. Необходимо поставить звёздочку перед именем и получим доступ к значению указателя.

Указатели могут ссылаться на другие указатели. При этом в ячейках памяти, на которые будут ссылаться первые указатели, будут содержаться не значения, а адреса вторых указателей. Число символов * при объявлении указателя показывает порядок указателя. Чтобы получить доступ к значению, на которое ссылается указатель его необходимо разыменовывать соответствующее количество раз.

Соседние файлы в папке инфа экзамен