Инициализация массива случайными числами



Министерство образования и науки РФ

Тверской государственный технический университет

Кафедра электронных вычислительных машин

 

 

Обработка одномерных массивов

 

 

Методические указания

к лабораторной работе № 3 по дисциплине

«Программирование на языках высокого уровня»

для студентов специальности 220100 (ВМКСС)

 

Тверь, 2009


Содержание

1. Цель работы.. 3

2. Теоретический материал. 3

Сортировка выбором. 4

Сортировка пузырьком. 3

Сортировка вставками. 5

Линейный поиск в массиве. 8

Двоичный поиск в массиве. 8

Инициализация массива случайными числами. 9

Измерение времени работы программы.. 10

3. Указание к работе. 11

4. Варианты индивидуальных заданий. 11

5. Оформление отчета. 24


Цель работы

Приобретение и закрепление навыков работы с одномерными массивами.

Теоретический материал

Сортировка пузырьком

Расположим массив сверху вниз, /от нулевого элемента - к последнему.

Идея метода: шаг сортировки состоит в проходе снизу вверх по массиву. По пути просматриваются пары соседних элементов. Если элементы некоторой пары находятся в неправильном порядке, то меняем их местами.

После нулевого прохода по массиву "вверху" оказывается самый "легкий" элемент - отсюда аналогия с пузырьком. Следующий проход делается до второго сверху элемента, таким образом, второй по величине элемент поднимается на правильную позицию...

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

 

Алгоритм сортировки «пузырьком» по убыванию представлен ниже:

 

i-цикл от 0 до size с шагом 1

j-цикл от 1 до size-i с шагом 1

   если a[j] > a[j-1], то

       x = a[j]

       a[j] = a[j-1]

       a[j] = x

   все если

все j-цикл

все i-цикл

 

Среднее число сравнений и обменов имеют квадратичный порядок роста: O(n2), отсюда можно заключить, что алгоритм пузырька очень медленен и малоэффективен.

Сортировка выбором

Идея метода состоит в том, чтобы создавать отсортированную последовательность путем присоединения к ней одного элемента за другим в правильном порядке.

Будем строить готовую последовательность, начиная с левого конца массива. Алгоритм состоит из n последовательных шагов, начиная от нулевого и заканчивая (n-1)-м.

На i-м шаге выбираем наименьший из элементов a[i] ... a[n] и меняем его местами с a[i]. Последовательность шагов при n=5 изображена на рисунке ниже.

 

Вне зависимости от номера текущего шага i, последовательность a[0]...a[i] (выделена курсивом) является упорядоченной. Таким образом, на (n-1)-м шаге вся последовательность, кроме a[n] оказывается отсортированной, а a[n] стоит на последнем месте по праву: все меньшие элементы уже ушли влево. Алгоритм сортировки выбором представлен ниже:

i-цикл от 0 до size с шагом 1

k = i

x = a[i]

j-цикл от i + 1 до size с шагом 1

   если a[j] < x, то

       k = j

       x = a[j]

   все если

все j-цикл

a[k] = a[i]

a[i] = x

все i-цикл

 

Для нахождения наименьшего элемента из n+1 рассматриваемых алгоритм совершает n сравнений. С учетом того, что количество рассматриваемых на очередном шаге элементов уменьшается на единицу, общее количество операций:

n + (n-1) + (n-2) + (n-3) + ... + 1 = 1/2 * ( n2+n ) = O(n2)

 

Таким образом, так как число обменов всегда будет меньше числа сравнений, время сортировки растет квадратично относительно количества элементов.

Алгоритм не использует дополнительной памяти: все операции происходят "на месте".

 

Сортировка вставками

Сортировка простыми вставками в чем-то похожа на вышеизложенные методы.

Аналогичным образом делаются проходы по части массива, и аналогичным же образом в его начале «вырастает» отсортированная последовательность...

Однако в сортировке пузырьком или выбором можно было четко заявить, что на i-м шаге элементы a[0]...a[i] стоят на правильных местах и никуда более не переместятся. Здесь же подобное утверждение будет более слабым: последовательность a[0]...a[i] упорядочена. При этом по ходу алгоритма в нее будут вставляться (см. название метода) все новые элементы.

Будем разбирать алгоритм, рассматривая его действия на i-м шаге. Как говорилось выше, последовательность к этому моменту разделена на две части: готовую a[0]...a[i] и неупорядоченную a[i+1]...a[n].

На следующем, (i+1)-м каждом шаге алгоритма берем a[i+1] и вставляем на нужное место в готовую часть массива.

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

В зависимости от результата сравнения элемент либо остается на текущем месте (вставка завершена), либо они меняются местами и процесс повторяется.

 

Таким образом, в процессе вставки мы «просеиваем» элемент x к началу массива, останавливаясь в случае, когда

1. Найден элемент, меньший x

2. Достигнуто начало последовательности.

Алгоритм сортировки вставками представлен ниже:

i-цикл от 0 до size с шагом 1

x = a[i]

   

j-цикл от i-1 пока (j >= 0 И a[j] > x) с шагом -1

   a[j+1] = a[j]

все j-цикл

 

a[j+1] = x

все i-цикл

 

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

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

Сортировка подсчетом

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

Суть метода заключается в том, что на каждом шаге подсчитывается, в какую позицию результирующего массива надо записать очередной элемент исходного массива. Выглядит это так:

Для i = 0 До N-1

    k = 0

Для j = 0  До N-1

              Если A(i) > A(j) И ли A(i) = A(j) И j < i, То

                       k = k +1

              Все-Если

Все-Для-j

B(k) = A(i)

Все-Для-i

Вычисление номера позиции, куда нужно поместить очередной элемент, реализуется, исходя из следующих соображений. Слева от B(k) должны стоять элементы, меньшие или равные B(k). Значит, число k складывается из количества элементов меньших A(i) и, возможно, некоторого числа элементов, равных A(i). Условимся, что из равных мы будем учитывать только те элементы, которые в исходном массиве стоят левее A(i).

Сортировка слиянием

Этот метод сортирует массив последовательным слиянием пар уже отсортированных подмассивов, поэтому его и назвали сортировкой слиянием. Поскольку данный метод имеет повышенную (по сравнению с уже рассмотренными) сложность, то алгоритм данного метода предлагается найти в литературе и реализовать самостоятельно.

Линейный поиск в массиве

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

Линейный поиск – простейшая разновидность алгоритмов поиска данных.

Например, если нам требуется найти число 5 в массиве из 15 элементов, то мы начинаем поиск с элемента с номером 0 и последовательно проверяем каждый элемент на равенство числу 5. Если совпадение найдено – необходимо запомнить номер элемента и завершить цикл поиска.

Ввиду простоты алгоритма его псевдокод и реализация не приводятся и предлагаются для самостоятельной работы.

Двоичный поиск в массиве

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

Переменные lowerBound и upperBound содержат, соответственно, левую и правую границы отрезка массива, где находится нужный нам элемент. Мы начинаем всегда с исследования среднего элемента отрезка. Если искомое значение меньше среднего элемента, мы переходим к поиску в верхней половине отрезка, где все элементы меньше только что проверенного. Другими словами, значением upperBound становится (M – 1) и на следующей итерации мы работаем с половиной массива. Таким образом, в результате каждой проверки мы вдвое сужаем область поиска. Так, в нашем примере, после первой итерации область поиска – всего лишь три элемента, после второй остается всего лишь один элемент. Таким образом, если длина массива равна 6, нам достаточно трех итераций, чтобы найти нужное число.

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

Алгоритм двоичного поиска приведен ниже:

lowerBound = 0

upperBound = size

 

Повторять бесконечно

M = (lowerBound + upperBound) / 2

 

Если K < A[M], то

   upperBound = M – 1

Иначе Если K > A[M], то

   lowerBound = M + 1

Иначе

   Сообщить «Элемент найден, его индекс: », M

   Выход из цикла

Все если

 

Если lowerBound > upperBound, то

   Сообщить «Элемент не найден»

   Выход из цикла

Все если

Все повторять

 

В описанном выше алгоритме приняты следующие условия:

1. size – размер массива

2. K – число, которое нужно найти

3. М – индекс найденного элемента.

Инициализация массива случайными числами

Для выполнения лабораторной работы №3 придется пользоваться массивами большого размера. Размеры массивов в данной работе могут достигать 15 тысяч элементов, что не позволяет реализовать ввод данных с клавиатуры. Для решения этой задачи предлагается использовать инициализацию массива случайными числами.

Для работы с генератором случайных чисел необходимо создать объект стандартного класса Random:

Random Rnd = new Random();

Инициализация массива выполняется с помощью метода Next класса Random и может выглядеть следующим образом:

int maxValue = 100;

 int[] a = new int[1000];

for (int i = 0; i < 1000; i++)

a[i] = Rnd.Next(0, maxValue); // Случайное число от 0 до 100


Дата добавления: 2020-01-07; просмотров: 317; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!