- •Часть 2
- •18 Сентября 2012 г., протокол № 1
- •Предисловие
- •Глава 6 простые типы данных § 1. Целый тип
- •1.1. Битовые операции
- •Использование битовых операций
- •1.3. Упаковка и распаковка информации
- •§ 2. Логический тип
- •§ 3. Символьный тип
- •§ 4. Вещественный тип
- •§ 5. Преобразование типов
- •Преобразование типов в выражениях
- •Преобразование типов при присваивании
- •Г л а в а 7 введение в указатели
- •§ 1. Понятие указателя. Операции разыменования и разадресации
- •§ 2. Инициализация и присваивание указателей
- •§ 3. Распределение динамической памяти
- •Операция new
- •Операция delete
- •§ 4. Параметры-указатели. Функция ввода scanf
- •Упражнения, тесты
- •Г л а в а 8 одномерные массивы, указатели и функции
- •§ 1. Связь указателей и одномерных массивов. Передача массива в качестве параметра функции
- •§ 2. Сортировка одномерных массивов
- •§ 3. Сортировка массива по параметру числа
- •§ 4. Сортировка массива выбором.
- •§ 5. Сортировка массива вставками
- •§ 6. Динамические одномерные массивы
- •6.1. Порядок работы с динамическим массивом
- •6.2. Работа с динамическим массивом в классе. Деструктор
- •§ 7. Введение в строки
- •Глава 9 мАтрицы
- •§ 1. Объявление, способы определения матриц
- •§ 2. Вывод матриц
- •§ 3. Типы алгоритмов
- •3.1. Построчная обработка
- •Обработка матрицы по столбцам
- •3.3. Обработка всей матрицы
- •3.4. Обработка части матрицы
- •Преобразование матрицы
- •Построение матриц
- •§ 4. Матрицы, указатели и функции
- •Упражнения и тесты
- •Обработка матрицы по столбцам.
- •Список реКоМендуемой литературы
- •Сборники задач по программированию
- •Оглавление
- •Методы программирования:
- •Лекции, примеры, тесты
- •Пособие для студентов механико-математического факультета
- •В двух частях
- •Часть 2
§ 3. Сортировка массива по параметру числа
Пример 2. Рассортировать одномерный целочисленный массив по возрастанию последней цифры числа. Если последняя цифра одинакова, то сортировать по возрастанию самого числа.
void MyInp(int x[],int size); /* Функция ввода массива размерности size*/
void MyOut(int x[],int size); /* Функция вывода массива размерности size*/
/* Сортировка массива по возрастанию последней цифры числа */
void MySort(int x[],int size);
/* Для одного числа получаем последнюю цифру */
int DIGIT(int num) { return abs(num % 10); }
/* Перестановка двух целых чисел */
void RR(int &u, int &v) { int t=u; u=v; v=t; };
int main() { const n=10; int A[n]; MyInp(A,n);
cout<<" Integer array\n"; MyOut(A,n); MySort(A,n);
cout<<" \n\Array after sorting\n"; MyOut(A,n);
getch(); return 0; } ;
void MyInp(int x[],int size)
{ for(int i=0; i<size; i++) cin>>x[i]; }
void MyOut(int x[],int size)
{ cout<<endl; for(int i=0; i<size; i++) cout<<x[i]<<" "; } ;
/* Если надо сортировать числовой массив по некоторому параметру числа, например, как в нашей задаче, по последней цифре числа, то в обычную сортировку необходимо внести следующие дополнения:
получаем массив параметров (массив D последних цифр);
в алгоритме сортировки сравниваем не числа массива, а эти параметры. И если параметры равны, только тогда сравниваем сами числа;
переставляем, если надо, элементы исходного массива и их параметры, чтобы они соответствовали тем же числам, что и до сортировки. */
void MySort(int *x, int size)
{ /* Получаем массив последних цифр */ int D[20];
/* 20 — наибольшая размерность */
for(int i=0; i<size; i++) D[i]=DIGIT(x[i]);
/* В качестве фактического параметра функции можно использовать индексированную переменную, то есть элемент массива, если параметром такой функции является простая переменная. В качестве формального параметра индексированную переменную записывать нельзя. */
int flag=1, k=size;
while (flag) { k--; flag=0;
for(int j=0; j<k; j++)
/* Сравниваем параметры чисел, а если они равны, то и сами числа */
if ( D[j]>D[j+1] || x[j]>x[j+1] && D[j]==D[j+1] )
{ RR(D[j], D[j+1]); // переставляем параметры
RR(x[j], x[j+1]); //переставляем исходные числа
flag=1; }
} // the end of while
} ; // the end of function MySort
§ 4. Сортировка массива выбором.
Пример 3. Сначала рассмотрим алгоритм такой сортировки, например, по убыванию. На первом этапе выбираем наибольший элемент всего массива, его номер k и переставляем x[0] c x[k], если k!=0. На втором этапе находим максимальный элемент, начиная со второго элемента x[1], его номер k и переставляем x[1] c x[k], если k!=1. Дальше находим наибольший элемент, начиная с третьего элемента x[2], его номер k и переставляем x[2] c x[k], если k!=2. Так продолжаем до конца массива. То есть на последнем этапе выбираем наибольший из двух последних элементов и, если надо, переставляем их.
Для массива 54, 43. 11. 77, 33, 90, 16 последовательно получим
11, 43. 54. 77, 33, 90, 16
11, 16. 54. 77, 33, 90, 43
11, 16. 33. 77, 54, 90, 43
11, 16, 33, 43, 54, 90, 77
11, 16, 33, 43, 54, 90, 77
11, 16, 33, 43, 54, 77, 90
Подчёркнуты и выделены числа, которые переставлялись на каждом этапе. Заметим, что на пятом этапе x[4] = 54 совпадает с наименьшим из трёх оставшихся чисел (k=4). Поэтому перестановка не выполнялась.
Программа рассмотренного алгоритма:
int MyMin, // минимальный элемент
k; // номер минимального элемента
/* Цикл для многократного поиска минимального элемента и перестановки его с тем, начиная с которого осуществляли поиск. */
for (int start=0; start<size-1; start++)
{ /* Поиск минимального элемента и его номера для части массива x[start], x[start+1], …, x[size-1] */
MyMin=x[start]; k=start;
for (int i=k+1; i<size; i++)
if (x[i]<MyMin) { MyMin=x[i]; k=i; }
/* Перестановка наименьшего элемента с номером k с x[start] */
x[k]=x[start]; x[start]=MyMin; }
