Сортировка массивов. Поиск в массиве

Содержание

Слайд 2

Программирование на языке Java Тема 24. Сортировка массивов

Программирование на языке Java

Тема 24. Сортировка массивов

Слайд 3

Сортировка Сортировка – это расстановка элементов массива в заданном порядке (по

Сортировка

Сортировка – это расстановка элементов массива в заданном порядке (по возрастанию,

убыванию, последней цифре, сумме делителей, …).
Задача: переставить элементы массива в порядке возрастания.
Алгоритмы:
простые и понятные, но неэффективные для больших массивов
метод пузырька
метод выбора
сложные, но эффективные
«быстрая сортировка» (Quick Sort)
сортировка «кучей» (Heap Sort)
сортировка слиянием
пирамидальная сортировка

сложность O(N2)

сложность O(N·logN)

Слайд 4

Метод пузырька Идея – пузырек воздуха в стакане воды поднимается со

Метод пузырька

Идея – пузырек воздуха в стакане воды поднимается со дна

вверх.
Для массивов – самый маленький («легкий») элемент перемещается вверх («всплывает»).

начиная снизу, сравниваем два соседних элемента; если они стоят «неправильно», меняем их местами
за 1 проход по массиву один элемент (самый маленький) становится на свое место

1-ый проход

2-ой проход

3-ий проход

Для сортировки массива из N элементов нужен N-1 проход (достаточно поставить на свои места N-1 элементов).

Слайд 5

Программа (1-ый проход) сравниваются пары A[N-2] и A[N-1], A[N-3] и A[N-2]

Программа (1-ый проход)

сравниваются пары
A[N-2] и A[N-1],
A[N-3] и A[N-2]


A[0] и A[1]

A[j] и A[j+1]

for( j = N-2; j >= 0 ; j-- )
if ( A[j] > A[j+1] ) {
c = A[j];
A[j] = A[j+1];
A[j+1] = c;
}

0

Слайд 6

Программа (следующие проходы) 2-ой проход for ( j = N-2; j

Программа (следующие проходы)

2-ой проход

for ( j = N-2; j >= 1

; j-- )
if ( A[j] > A[j+1] ) {
c = A[j];
A[j] = A[j+1];
A[j+1] = c;
}

1

(i+1)-ый проход

for ( j = N-2; j >= i ; j-- )
...

i

Слайд 7

Программа public static void main(String[] args) { int N = 10;

Программа

public static void main(String[] args)
{
int N = 10;
int A[N],

i, j, c;
// заполнить массив
// вывести исходный массив
for (i = 0; i < N-1; i ++){
for (j = N-2; j >= i ; j --)
if ( A[j] > A[j+1] ) {
с = A[j];
A[j] = A[j+1];
A[j+1] = с;
}
}
// вывести полученный массив
}

элементы выше A[i] уже поставлены

i

меняем A[j] и A[j+1]

Слайд 8

Метод пузырька с флажком Идея – если при выполнении метода пузырька

Метод пузырька с флажком

Идея – если при выполнении метода пузырька не

было обменов, массив уже отсортирован и остальные проходы не нужны.
Реализация: переменная-флаг, показывающая, был ли обмен; если она равна false, то выход.

do {
flag = false; // сбросить флаг
for (j = N-2; j >= 0; j --)
if ( A[j] > A[j+1] ) {
с = A[j];
A[j] = A[j+1];
A[j+1] = с;
flag = true; // поднять флаг
}
}
while ( flag ); // выход при flag = false

flag = false;

flag = true;

( flag );

boolean flag;

Слайд 9

Метод пузырька с флажком i = 0; do { flag =

Метод пузырька с флажком

i = 0;
do {
flag = false; //

сбросить флаг
for ( j = N-2; j >= i ; j -- )
if ( A[j] > A[j+1] ) {
с = A[j];
A[j] = A[j+1];
A[j+1] = с;
flag = true; // поднять флаг
}
i ++;
}
while ( flag ); // выход при flag = false

i = 0;

i

i ++;

Слайд 10

Метод выбора Идея: найти минимальный элемент и поставить на первое место

Метод выбора

Идея:
найти минимальный элемент и поставить на первое место (поменять местами

с A[0])
из оставшихся найти минимальный элемент и поставить на второе место (поменять местами с A[1]), и т.д.
Слайд 11

Метод выбора N for( i = 0; i nMin = i

Метод выбора

N

for( i = 0; i < N-1 ; i ++

) {
nMin = i ;
for ( j = i+1; j < N; j ++)
if( A[j] < A[nMin] ) nMin = j;
if( nMin != i ) {
c = A[i];
A[i] = A[nMin];
A[nMin] = c;
}
}

N-1

нужно N-1 проходов

поиск минимального от A[i] до A[N-1]

если нужно, переставляем

i+1

i

Слайд 12

Задания Задача 1: Заполнить массив из 10 элементов случайными числами в

Задания

Задача 1: Заполнить массив из 10 элементов случайными числами в интервале

[0..100] и отсортировать его по последней цифре.
Пример:
Исходный массив:
14 25 13 30 76 58 32 11 41 97
Результат:
30 11 41 32 13 14 25 76 97 58
Задача 2: Заполнить массив из 10 элементов случайными числами в интервале [0..100] и отсортировать первую половину по возрастанию, а вторую – по убыванию.
Пример:
Исходный массив:
14 25 13 30 76 58 32 11 41 97
Результат:
13 14 25 30 76 97 58 41 32 11
Слайд 13

Формирование массива по условию Задача – найти в массиве элементы, удовлетворяющие

Формирование массива по условию

Задача – найти в массиве элементы, удовлетворяющие некоторому

условию (например, отрицательные), и скопировать их в другой массив.

Примитивное решение:

int N = 5;
int A[N], B[N];
// здесь заполнить массив A
for( i = 0; i < N; i ++ )
if( A[i] < 0 ) B[i] = A[i];

A

B

выбранные элементы не рядом, не в начале массива
непонятно, как с ними работать

Слайд 14

Формирование массива по условию Решение: ввести счетчик найденных элементов count, очередной

Формирование массива по условию

Решение: ввести счетчик найденных элементов count, очередной элемент

ставится на место B[count].

int A[N], B[N], count = 0;
// здесь заполнить массив A
for( i = 0; i < N; i ++ )
if( A[i] < 0 ) {
B[count] = A[i];
count ++;
}
// вывод массива B
for( i = 0; i < count; i ++ )
System.out.printf(
"%d\n", B[i]);

A

B

count

Слайд 15

Задания Задача 1: Заполнить массив случайными числами и отобрать в другой

Задания

Задача 1: Заполнить массив случайными числами и отобрать в другой массив

все числа, у которых вторая с конца цифра (число десятков) – ноль.
Пример:
Исходный массив:
40 105 203 1 14
Результат:
105 203 1
Задача 2: Заполнить массив случайными числами и выделить в другой массив все числа, которые встречаются более одного раза.
Пример:
Исходный массив:
4 1 2 1 11 2 34
Результат:
1 2
Слайд 16

Программирование на языке Java Тема 25. Поиск в массиве

Программирование на языке Java

Тема 25. Поиск в массиве

Слайд 17

Поиск в массиве Задача – найти в массиве элемент, равный X,

Поиск в массиве

Задача – найти в массиве элемент, равный X, или

установить, что его нет.
Решение: для произвольного массива: линейный поиск (перебор)
недостаток: низкая скорость
Как ускорить? – заранее подготовить массив для поиска
как именно подготовить?
как использовать «подготовленный» массив?
Слайд 18

Линейный поиск nX = -1; for ( i = 0; i

Линейный поиск

nX = -1;
for ( i = 0; i < N;

i ++)
if ( A[i] == X ) {
nX = i;
break; //выход из цикла
}


Улучшение: после того, как нашли X, выходим из цикла.

break;

nX = -1; // пока не нашли ...
for ( i = 0; i < N; i ++) // цикл по всем элементам
if ( A[i] == X ) // если нашли, то ...
nX = i; // ... запомнили номер
if (nX<0) System.out.printf("Не нашли...");
else System.out.printf("A[%d]=%d", nX, X);

nX – номер нужного элемента в массиве

Слайд 19

Двоичный поиск X = 7 X 8 4 X > 4

Двоичный поиск

X = 7

X < 8

8

4

X > 4

6

X > 6

Выбрать средний

элемент A[c] и сравнить с X.
Если X = A[c], нашли (выход).
Если X < A[c], искать дальше в первой половине.
Если X > A[c], искать дальше во второй половине.
Слайд 20

Двоичный поиск N-1 nX = -1; L = 0; R =

Двоичный поиск

N-1

nX = -1;
L = 0; R =

N-1; // границы: ищем от A[0] до A[N-1]
while ( R >= L ){
c = (R + L) / 2;
if (X = = A[c]) {
nX = c;
break;
}
if (X < A[c]) R = c - 1;
if (X > A[c]) L = c + 1;
}
if (nX < 0) System.out.printf("Не нашли...");
else System.out.printf("A[%d]=%d", nX, X);

номер среднего элемента

если нашли …

выйти из цикла

сдвигаем границы

>

Слайд 21

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

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