Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга_2013_2_часть+.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
816.64 Кб
Скачать

§ 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]<<" "; } ;

/* Если надо сортировать числовой массив по некоторому параметру числа, например, как в нашей задаче, по последней цифре числа, то в обычную сортировку необходимо внести следующие дополнения:

  1. получаем массив параметров (массив D последних цифр);

  2. в алгоритме сортировки сравниваем не числа массива, а эти параметры. И если параметры равны, только тогда сравниваем сами числа;

  3. переставляем, если надо, элементы исходного массива и их параметры, чтобы они соответствовали тем же числам, что и до сортировки. */

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; }