Составить алгоритм и программу сортировки элементов - C (СИ)
Формулировка задачи:
Составить алгоритм и программу сортировки элементов двумерного квадратного массива размером N (N> 5) по указанным правилам. (Стрелка указывает направление от меньшего к большему элемента).
Сначала , думаю, стоит диагональ перевести в одномерный массив и отсортировать его. Потом занести обратно в массив 2-мерный.
2) Начать сортировать в таком порядке : (см. рисунок)
Вот так думал решать, и вродь правильно, а отразить в коде не получается.
Решение задачи: «Составить алгоритм и программу сортировки элементов»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 9
void pr(int*, int);
void sort(int*, int, int, int);
int main()
{
int i, j, x, min, temp, A[N][N];
srand(time(NULL));
for(i = 0; i < N; i++, putchar('\n'))
for(j = 0; j < N; j++)
printf("%3d", A[i][j] = rand() % 54);
for(i = N - 1; i > 0; i--){
min = A[i][i];
x = i;
for(j = i; j >= 0; j--)
if(A[j][j] < min){
min = A[j][j];
x = j;
}
temp = A[i][i];
A[i][i] = min;
A[x][x] = temp;
}
putchar('\n');
for(i = 1, j = 2; i < N - 2; i++){
sort(&A[0][0], i, j, N);
j++;
sort(&A[0][0], i, j, N);
}
putchar('\n');
pr(&A[0][0], N);
return 0;
}
void pr(int*arr, int size)
{
int i;
for(i = 0; i < size * size; i++){
if(i != 0 && i % size == 0)
putchar('\n');
printf("%3d", *arr);
arr++;
}
}
void sort(int*ptr, int row, int col, int size)
{
int i, j, x, y, k, l, *arr[N], min, temp;
for(i = 0; i < size; i++)
arr[i] = ptr + i * size;
for(k = row, l = col; k > 0 && l < N - 1; k--, l++){
for(i = k, j = l, min = arr[i][j], x = i, y = j; i >= 0 && j < N; i--, j++){
if(min > arr[i][j]){
min = arr[i][j];
x = i;
y = j;
}
}
temp = arr[k][l];
arr[k][l] = min;
arr[x][y] = temp;
}
}
Объяснение кода листинга программы
- Объявлены массив A размером NxN и переменные i, j, x, min, temp, srand(time(NULL));
- В цикле заполняют массив A случайными числами от 0 до 53
- Начинают сортировку с внутреннего квадрата массива (i=N-1, j=N-1) и двигаются к внешнему квадрату (i=0, j=0)
- Во внутреннем цикле ищут минимальный элемент в строке и запоминают его и его индексы
- Меняют местами минимальный элемент с элементом в правом верхнем углу массива
- Во внешнем цикле двигаются к следующему внутреннему квадрату (i=N-2, j=N-2)
- Продолжают сортировку пока не отсортируют весь массив
- Выводят отсортированный массив на экран
- В функции pr выводят массив на экран
- В функции sort сортируют массив внутри заданного квадрата (i=row, j=col) по заданному направлению (k=row, l=col)
- Внутренний цикл определяет минимальный элемент в строке и запоминает его и его индексы
- Меняют местами минимальный элемент с элементом в правом верхнем углу массива
- Продолжают сортировку пока не отсортируют весь массив внутри заданного квадрата