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

7.4 Cортировка массивов.

Cортировку следует понимать как процесс перегруппировки элементов массива в некотором определенном порядке. Цель сортировки – облегчить последующий поиск элементов в таком отсортированном массиве. Алгоритмы сортировки относятся к фундаментальным алгоритмам программирования.

Порядок сортировки:

  • по возрастанию элементов: (a[i]<a[i+1], для i=0, 1, …,n-2)

  • по убыванию элементов: (a[i]>a[i+1], для i=0, 1, …,n-2)

  • по невозрастанию элементов: (a[i]>=a[i+1], для i=0, 1, …,n-2)

  • по неубыванию элементов: (a[i]<=a[i+1], для i=0, 1, …,n-2)

Рассмотрим три базовых сортировки.

Сравнительные характеристики этих сортировок можно(нужно) прочитать в книге Н.Вирт “Алгоритмы и структуры данных”( Это содержание одной из самостоятельных работ.)

7.4.1 Обменная сортировка (метод пузырька)

Пузырьковая сортировка относится к классу обменных сортировок. Проходя по массиву, сравниваем два соседних элемента. Если они неупорядочены – меняем местами. В результате первого прохода наибольший переходит в последнюю позицию ("тяжелый пузырек всплывает наверх").

Повторяем проходы (n-1) раз, сокращая каждый раз длину прохода на один шаг.

void sort_1(int *a,int n)

{ int i,j,x;

for ( i=1;i<n;i++)

for ( j=0;j<n-i;j++)

if(a[j]>a[j+1]){x=a[j];a[j]=a[j+1];a[j+1]=x;}

}

7.4.2 Метод "простой выбор".

Суть метода заключается в следующем.

Находим наименьшее во всем массиве - ставим на первое место, а первый на место наименьшего, далее находим наименьшее среди всех, кроме первого, и меняем местами со вторым; затем наименьшее среди оставшихся n-2 элементов и т.д. Выстраивая таким образом очередные минимумы, сортируем элементы массива в порядке, например, неубывания (нестрогое возрастание).

Алгоритм:

for (i=0;i<n-1;i++)

{

Определить Nmin - номер наименьшего в ряду

Ai, Ai+1, Ai+2,…,An-1

Поменять местами Аi и ANmin

};

void sort_2(int *a,int n)

{ int i,j,Nmin,z;

for (i=0;i<n-1;i++)

{ Nmin=i;

for (j=i+1;j<n;j++)

if (a[j]<a[Nmin]) Nmin=j;

z=a[i]; a[i]=a[Nmin]; a[Nmin]=z ; }}

7.4.3 Сортировка "прямое включение"

При каждом шаге, начиная с i=1, берем элемент a[i] и сдвигаем его влево на надлежащее ему место. В исходной позиции слева от него - уже упорядоченая подпоследовательность. При движении элемента влево, предшествующие ему- сдвигаются вправо. Двигаем влево, пока наш элемент меньше текущего.

Метод:

Суть метода - кратко:

for (i=1; i< n;i++)

{

x=a[i];

включение х на надлежащее место в ряду a[0],a[2],..a[i]

}

void sort_3(int* a,int n)

{

int i,j,x;

for (i=1;i<n;i++)

{ x=a[i];

j=i-1;

while(j>=0 && a[j]>x)

{

a[j+1]=a[j];

j--; }

a[j+1]=x;}}

8 . Матрицы

8.1 Статические матрицы.

Описание матрицы в программе:

<тип элем.><имя_матрицы> [количество строк] [количество столбцов];

Память под статические матрицы выделяется на этапе компиляции. Компилятор должен точно знать, сколько выделить. Размеры матрицы вместе с типом ее элементов определяют объем памяти, необходимый для размещения матрицы.

Поскольку выделение памяти осуществляется на этапе компиляции, размерность может быть задана только целой положительной константой или константным выражением.

Память под статическую матрицу выделяется в сегменте данных, и сохраняется за ней до конца работы программы.

const int n=4,m-5;

int matr [n][m];

задает описание двумерного массива из 4 строк и 5 столбцов. В памяти такой массив располагается в последовательных ячейках построчно. Многомерные массивы размещаются так, что при переходе к следующему элементу быстрее нсего изменяется последний индекс. Для доступа к элементу многомерного массива указываются все его индексы, например, matr[i][j] .

При инициализации многомерного массива он представляется либо как массив из массивов, при этом каждый массив заключается в свои фигурные скобки (в этом случае размерности при описании можно не указывать), либо задается общий список элементов в том порядке, в котором элементы располагаются в памяти:

int matr2 [][]={ {(1, 1}, {0, 2}, {1, 0} };

int matr2 [3][2]={1, 1, 0, 2, 1, 0};

Стандартные варианты обхода матрицы.

Обход матрицы по строкам.

_________________________

……………………………… for (i = 0; i<n; i++)

_________________________ for (j = 0; j<m; j++)

Ai,0 Ai,1 Ai,2……………….Ai,m-1 …..A[i][j]….

_________________________

Обход матрицы по столбцам.

| | | A0,j | for (j = 0; j<m; j++)

| | | A1,j | for (i = 0; i<n; i++)

| | | A2,j | …..A[i][j]…..

| | | |

| | | An-1,j |

Пример 1. Дана матрица А. В порядке обхода по строкам определить наибольший элемент матрицы, а также его индексы (если наибольший повторяется , то индексы первого из них).

#include <iostream.h>

#include <iomanip.h>

#include <limits.h>

#include <conio.h>

const int n=4,m=5;

int main(){

int i,j,max,Imax,Jmax ,a[n][m];

cout<<" введите "<<n<<" строк по "<<m<<”элементов\n”;

for ( i=0;i<n;i++)

for ( j=0;j<m;j++)

cin>>a[i][j];

cout<<" \n \n исходная матрица \n";

for ( i=0;i<n;i++)

{

for ( j=0;j<n;j++)

cout<<setw(4)<<a[i][j]<<’ ‘;

cout<<"\n";

}

max=INT_MIN;

for ( i=0;i<n;i++)

for ( j=0;j<m;j++)

if (a[i][j]>max) {max=a[i][j]; Imax=i;Jmax=j;}

cout<<" \n\n MAX="<<max<<" Imax=”<<Imax<<” Jmax=”<<Jmax<<”\n" ;

getch();

}

Пример 2. Дана матрица А. В каждой строке определить наибольший элемент также его порядковый номер в строке(если наибольший повторяется , то номер первого из них).

#include <iostream.h>

#include <iomanip.h>

#include <conio.h>

const int n=4,m=5;

int main(){

int i,j,max,Jmax ,a[n][m];

cout<<" введите "<<n<<" строк по "<<m<<”элементов\n”;

for ( i=0;i<n;i++)

for ( j=0;j<m;j++)

cin>>a[i][j];

for ( i=0;i<n;i++)

{ max= INT_MIN;

for ( j=0;j<m;j++)

if (a[i][j]>max) {max=a[i][j];Jmax=j;}

cout<<" \n строка “<<i<<” MAX="<<max<<” Jmax=”<<Jmax<<”\n" ;

}

getch();

}

Пример 3. Дана матрица А. Напечатать номера столбцов, упорядоченных по возрастанию элементов.

#include <iostream.h>

# #include <conio.h>

const int n=4,m=5;

int main(){

int i,j ,a[n][m];

cout<<" введите "<<n<<" строк по "<<m<<”элементов\n”;

for ( i=0;i<n;i++)

for ( j=0;j<m;j++)

cin>>a[i][j];

cout<<”\nНомера упорядоченных столбцов\n”;

int f=1;

for ( j=0;j<m;j++)

{ for ( i=0;i<n-1&& (a[i][j]<a[i+1][j]; i++);

if(i==n-1) {cout<<" “<<j ;f=0;}

}

if(f) cout<<”таких столбцов нет\n”;

getch();}

Пример 4. Замечательные линии в матрице.

Дана квадратная матрица A[n][n]. Линия, соединяющая левый верхний и правый нижний углы, называется главной диагональю. Линия, соединяющая правый верхний и левый нижний углы, называется побочной диагональю.

Пример 4.1 Для каждой строки вывести на экран элемент, стоящий на пересечении строки и главной диагонали

for ( i=0;i<n;i++)

cout<<A[i][i]<<endl;

Пример 4.2 Для каждой строки вывести на экран элемент, стоящий на пересечении строки и побочной диагонали

for ( i=0;i<n;i++)

cout<<A[i][n-i-1]<<endl;

Пример 4. 3 Поменять местами элементы, симметричные относительно главной диагонали

#include<iostream.h>

#include<iomanip.h>

#include<conio.h>

const int n=5;

void input(int w[n][n])

{int i,j;

cout<<"input "<<n<<" strok "<<m<<" elem\n";

for( i=0;i<n;i++)

for( j=0;j<n;j++)

cin>>w[i][j];

}

//----------------------------------------

void output(int w[n][n], char title[])

{ cout<<title;

for(int i=0;i<n;i++)

{

for(int j=0;j<n;j++)

cout<<setw(4)<<w[i][j]<<' ';

cout<<endl;

}

}

//-----------------------------------------------

void change_1(int w[n][n])

{ for(int i=1;i<n;i++)

for(int j=0;j<i;j++)

{z=w[i][j];

w[i][j]= w[j][i];

w[j][i]=max;

}

}

int main()

{ int A[n][n];

clrscr();

input(A);

output(A,"\n ishodnaya A\n");

change_1(A);

output(a,"\n izmenen A\n");

getch();

}

Пример 4.4 Функция, меняющая местами элементы, симметричные относительно побочной диагонали.

void change_2(int w[n][n])

{ for(int i=0; i<n-1; i++)

for(int j=0; j<n-i-1; j++)

{z=w[i][j];

w[i][j]= w[n-j-1][n-i-1];

w[j][i]=max;

}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]