Сортировка массива методом линейного выбора с обменом
Рассмотрим задачу сортировки массива из 5 элементов по возрастанию.
Программа для решения этой задачи на языке СИ выглядит следующим образом:
#include <stdio.h>
#include <stdlib.h>
void main() {
int a[]={5, 9, 2, 1, 8};
int i, j, nom, min, buf;
for(i=0; i<4; i++) {
min=a[i];
nom=i;
for(j=i; j<5; j++)
if (a[j]<min) {
min=a[j];
nom=j;
}
buf=a[i];
a[i]=min;
a[nom]=buf;
}
for (j=0; j<5; j++)
printf("%4d",a[j]);
}
Выходим из внешнего цикла, так как i на следующем проходе будет равно 4, по условию i<4
Программа для решения этой задачи на языке СИ выглядит следующим образом:
#include <stdio.h>
#include <stdlib.h>
void main() {
int a[]={5, 9, 2, 1, 8};
int i, j, nom, min, buf;
for(i=0; i<4; i++) {
min=a[i];
nom=i;
for(j=i; j<5; j++)
if (a[j]<min) {
min=a[j];
nom=j;
}
buf=a[i];
a[i]=min;
a[nom]=buf;
}
for (j=0; j<5; j++)
printf("%4d",a[j]);
}
Давайте разберёмся с этой программкой и выполним её по шагам.
Командой int a[]={5, 9, 2, 1, 8}; создаётся массив из пяти элементов.
int i, j, nom, min, buf; - задаются переменные:
i - номер просмотра;
j - позиция элемента в массиве;
nom - позиция минимального элемента в массиве;
min - значение минимального элемента в массиве;
buf - буфер для перестановки элементов местами.
Строкой for(i=0; i<4; i++) начинается внешний цикл программы. Следует оговорится, что если в программе есть вложенный цикл, то пока не выполнится внутренний цикл, следующая итерация внешнего цикла не начинается.
Рассмотрим проходы внешнего и внутреннего циклов.
Массив до начала циклов выглядит следующим образом:
Значение элемента массива (a[i])
|
5
|
9
|
2
|
1
|
8
|
Позиция (i)
|
0
|
1
|
2
|
3
|
4
|
Первый проход по внешнему циклу
i =
0 (i – позиция элемента
массива)
min
= 5
nom = 0
Первый проход по
внутреннему циклу
j=0
a[0]<5
(нет) // a[0] – значение
элемента массива на нулевой позиции, т. е a[0] это 5
Второй проход по внутреннему циклу
j = 1
a[1]<5
(нет) // a[1] – значение
элемента массива на первой позиции, т. е a[1] это 9
Третий проход по
внутреннему циклу
j = 2
a[2]<5
(да) // a[2] – значение
элемента массива на второй позиции, т. е a[2] это 2
min = 2
nom
= 2
Четвёртый проход по
внутреннему циклу
j = 3
a[3]<2
(да) // a[3] – значение
элемента массива на третьей позиции, т. е a[3] это 1
min
= 1
nom
= 3
Пятый проход по
внутреннему циклу
j = 2
a[4]<1
(нет) // a[4] – значение
элемента массива на четвёртой позиции, т. е a[4] это 8
Выходим из внутреннего цикла, так как j на следующем проходе будет равно 5, по условию j<5
buf=5
a[0]=1
a[3]=5
По завершению первого прохода внешнего цикла, массив будет
иметь вид:
Значение элемента массива
|
1
|
9
|
2
|
5
|
8
|
Позиция
|
0
|
1
|
2
|
3
|
4
|
Второй проход по внешнему циклу
i = 1
(i – позиция элемента
массива)
min
= 9
nom
= 1
Первый проход по
внутреннему циклу
j=1
a[1]<9(нет)
// a[1] – значение
элемента массива на первой позиции, т. е a[1] это 9
Второй проход по внутреннему циклу
j = 2
a[2]<9
(да) // a[2] – значение
элемента массива на второй позиции, т. е a[2] это 2
min
= 2
nom
= 2
Третий проход по
внутреннему циклу
j = 3
a[3]<2
(нет) // a[3] – значение
элемента массива на третьей позиции, т. е a[3] это 5
Четвёртый проход по
внутреннему циклу
j = 4
a[4]<2
(нет) // a[4] – значение
элемента массива на четвёртой позиции, т. е a[4] это 8
Выходим из внутреннего цикла, так как j на следующем проходе будет равно 5, по условию j<5
buf=9
a[1]=2
a[2]=9
По завершению второго прохода внешнего цикла, массив будет
иметь вид:
Значение элемента массива (a[i])
|
1
|
2
|
9
|
5
|
8
|
Позиция (i)
|
0
|
1
|
2
|
3
|
4
|
Третий проход по внешнему циклу
i = 2
(i – позиция элемента
массива)
min
= 9
nom
= 2
Первый проход по
внутреннему циклу
j=2
a[2]<9(нет)
// a[2] – значение
элемента массива на второй позиции, т. е a[2] это 9
Второй проход по внутреннему циклу
j = 3
a[3]<9
(да) // a[3] – значение
элемента массива на третьей позиции, т. е a[3] это 5
min
= 5
nom
= 3
Третий проход по
внутреннему циклу
j = 4
a[4]<5
(нет) // a[4] – значение
элемента массива на четвёртой позиции, т. е a[4] это 8
Выходим из внутреннего цикла, так как j на следующем проходе будет равно 5, по условию j<5
buf=9
a[2]=5
a[3]=9
По завершению третьего прохода внешнего цикла, массив будет
иметь вид:
Значение элемента массива (a[i])
|
1
|
2
|
5
|
9
|
8
|
Позиция (i)
|
0
|
1
|
2
|
3
|
4
|
Четвёртый проход по внешнему
циклу
i = 3
(i – позиция элемента
массива)
min
= 9
nom
= 3
Первый проход по
внутреннему циклу
j=3
a[3]<9(нет)
// a[3] – значение
элемента массива на третьей позиции, т. е a[3] это 9
Второй проход по внутреннему циклу
j = 4
a[4]<9
(да) // a[4] – значение
элемента массива на четвёртой позиции, т. е a[4] это 8
min
= 8
nom
= 4
Выходим из внутреннего цикла, так как j на следующем проходе будет равно 5, по условию j<5
buf=9
a[3]=8
a[4]=9
По завершению четвёртого прохода внешнего цикла, массив
будет иметь вид:
Значение элемента массива (a[i])
|
1
|
2
|
5
|
8
|
9
|
Позиция (i)
|
0
|
1
|
2
|
3
|
4
|
Строки for (j=0; j<5; j++) printf("%4d",a[j]); выводят отсортированный массив на экран