- •1. Массивы в языке Си: объявление, начальная инициализация, доступ к элементам массива. Индексное выражение.
- •2. Особенности организации одномерных и многомерных массивов в языке Си. Понятие приведенного индекса массива.
- •3. Определение алгоритма и его свойства
- •5. Какие спецификации форматов ввода-вывода данных имеют функции scanf() и printf()? Каким образом организовывать ввод данных для поддержки программной обработка неправильно введенных данных?
- •1.Алгоритм "Сортировка выбором".
- •2.Алгоритм "Сортировка пузырьком".
- •3.Алгоритм "Шейкерная сортировка"
1.Алгоритм "Сортировка выбором".
Алгоритм: 1. Находим минимальный элемент в массиве. 2. Меняем местами минимальный и первый элемент местами. 3. Опять ищем минимальный элемент в неотсортированной части массива 4. Меняем местами уже второй элемент массива и минимальный найденный, потому как первый элемент массива является отсортированной частью. 5. Ищем минимальные значения и меняем местами элементы,пока массив не будет отсортирован до конца.
//Сортировка выбором {---
Функция СортировкаВыбором(Знач Массив)
Мин = 0;
Для i = 0 По Массив.ВГраница() Цикл
Мин = i;
Для j = i + 1 ПО Массив.ВГраница() Цикл //Ищем минимальный элемент в массиве
Если Массив[j] < Массив[Мин] Тогда
Мин = j;
КонецЕсли;
КонецЦикла;
Если Массив [Мин] = Массив [i] Тогда //Если мин. элемент массива = первому элементу неотс. части массива, то пропускаем.
Продолжить;
КонецЕсли;
Смена = Массив[i]; //Производим замену элементов массива.
Массив[i] = Массив[Мин];
Массив[Мин] = Смена;
КонецЦикла;
Возврат Массив;
КонецФункции
2.Алгоритм "Сортировка пузырьком".
Алгоритм: 1. Каждый элемент массива сравнивается с последующим и если элемент[i] > элемент[i+1] происходит замена. Таким образом самые "легкие" элементы "всплывают" - перемещаются к началу списка,а самые тяжелые "тонут" - перемещаются к концу. 2. Повторяем Шаг 1 n-1 раз, где n - Массив.Количество ().
//Сортировка пузырьком {---
Функция СортировкаПузырьком(Знач Массив)
Для i = 0 По Массив.ВГраница() Цикл
Для j = 0 ПО Массив.Вграница() - i - 1 Цикл
Если Массив[j] > Массив[j + 1] Тогда
Замена = Массив[j];
Массив[j] = Массив[j + 1];
Массив[j + 1] = Замена;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат Массив;
КонецФункции
//---}
3.Алгоритм "Шейкерная сортировка"
Алгоритм такой же, что и у пузырьковой сортировки + добавляется цикл пробега сверху-вниз.
В приведенном ниже примере, есть усовершенствование в шейкерной сортировке. В отличие от классической, используется в 2 раза меньше итераций.
//Сортировка перемешивание (Шейкер-Сортировка) {---
Функция СортировкаПеремешиванием(Знач Массив)
Для i = 0 ПО Массив.ВГраница()/2 Цикл
нИтер = 0;
конИтер = Массив.ВГраница();
Пока нИтер Массив[нИтер+1] Тогда
Замена = Массив[нИтер];
Массив[нИтер] = Массив[нИтер + 1];
Массив[нИтер + 1] = Замена;
КонецЕсли;
нИтер = нИтер + 1;//Двигаем позицию на шаг вперед
//Проходим с конца
Если Массив[конИтер - 1] > Массив[конИтер] Тогда
Замена = Массив[конИтер - 1];
Массив[конИтер-1] = Массив[конИтер];
Массив[конИтер] = Замена;
КонецЕсли;
конИтер = конИтер - 1;//Двигаем позицию на шаг назад
КонецЦикла;
КонецЦикла;
Возврат Массив;
КонецФункции
//---}
4. Алгоритм "Сортировка вставками".
Смысл заключается в том, что на каждом шаге мы берем элемент, ищем для него позицию и вставляем в нужное место. Элементарный пример: При игре в дурака, вы тянете из колоды карту и вставляете ее в соответствующее место по возрастанию в имеющихся у вас картах. Или в магазине вам дали сдачу 550 рублей- одна купюра 500, другая 50. Заглядываете в кошелек, а там купюры достоинством 10,100,1000. Вы вставляете купюру достоинсвом 50р. между купюрами достоинством 10р и 100р, а купюру в 500 рублей между купюрами 100р и 1000р. Получается 10,50,100,500,1000 - Вот вам и алгоритм "Сортировка вставками". Таким образом с каждым шагом алгоритма, вам необходимо отсортировать подмассив данных и вставить значение в нужное место.
//Сортировка вставками {---
Функция СортировкаВставками(Знач Массив)
Для i = 0 По Массив.ВГраница()-1 Цикл
Ключ = i + 1;
Замена = Массив[Ключ];
j = i + 1;
Пока j > 0 И Замена < Массив[j - 1] Цикл
Массив[j] = Массив[j - 1];
Замена = j - 1;
Ключ = j - 1;
j = j - 1;
КонецЦикла;
Массив[Ключ] = Замена;
КонецЦикла;
Возврат Массив;
КонецФункции
//---}
5. Бинарный поиск
Подготовка. Перед началом поиска устанавливаем левую и правую границы массива:
left = 0, right = 19
Шаг 1. Ищем индекс середины массива (округляем в меньшую сторону):
mid = (19+0)/2=9
Сравниваем значение по этому индексу с искомым:
69 < 82
Сдвигаем левую границу:
left = mid = 9
Шаг 2. Ищем индекс середины массива (округляем в меньшую сторону):
mid = (9+19)/2=14
Сравниваем значение по этому индексу с искомым:
84 > 82
Сдвигаем правую границу:
right = mid = 14
Шаг 3. Ищем индекс середины массива (округляем в меньшую сторону):
mid = (9+14)/2=11
Сравниваем значение по этому индексу с искомым:
78 < 82
Сдвигаем левую границу:
left = mid = 11
Шаг 4. Ищем индекс середины массива (округляем в меньшую сторону):
mid = (11+14)/2=12
Сравниваем значение по этому индексу с искомым:
80 < 82
Сдвигаем левую границу:
left = mid = 12
Шаг 5. Ищем индекс середины массива (округляем в меньшую сторону):
mid = (12+14)/2=13
Сравниваем значение по этому индексу с искомым:
82 = 82
Решение найдено!
Чтобы уменьшить количество шагов поиска можно сразу смещать границы поиска на элемент, следующий за серединой отрезка:
left = mid + 1 right = mid - 1