Содержание
Задача: создать двумерный массив размерностью m на n элементов, заполнив его случайными числами в диапазоне от 0 до 9. Отсортировать элементы массива по возрастанию вначале по строкам, а затем по столбцам. Вывести на экран исходный массив, массив отсортированный по-строчно, массив отсортированный по столбцам. Для сортировки применить метод пузырька.
Что необходимо знать
Для выполнения работы нам необходимо знать:
- Основные сведения по работе с многомерными и одномерными массивами
- Как реализуется алгоритм сортировки массива «Сортировка пузырьком«
- Как в C# генерировать случайные числа
Ход выполнения работы
Необходимые методы
Исходя из условий задачи, нам потребуется написать следующие методы:
- Метод генерации двумерного массива заданной размерности
- Метод вывода массива в консоль
- Метод сортировки массива алгоритмом пузырька
Метод генерации двумерного массива заданной размерности
public static int[,] GenerateArray(int t, int i)
{
int[,] table = new int[t, i];
Random random = new Random();
for (int a = 0; a < t; a++)
{
for (int b = 0; b < i; b++)
{
table[a, b] = random.Next(0, 9);
}
}
return table;
}
На входе метод получает размерности массива. Далее, создается сам массив:
int[,] table = new int[t, i];
Объект класса Random для генерации случайных чисел:
Random random = new Random();
Random представляет генератор псевдослучайных чисел, то есть использует такой алгоритм, который генерирует последовательность чисел, отвечающую определенным статистическим критериям случайности.После этого, в цикле происходит заполнение массива цифрами от 0 до 9:
table[a, b] = random.Next(0, 9);
Метод вывода двумерного массива в консоль
public static void PrintArray(int[,] array)
{
for (int a = 0; a < array.GetLength(0); a++)
{
for (int b = 0; b < array.GetLength(1); b++)
{
Console.Write(array[a, b] + " ");
}
Console.WriteLine();
}
}
Здесь все достаточно просто. Так как мы точно знаем, что массив двумерный, то используем два цикла for, в которых проходимся по соответствующим измерениям массива и выводим значения элементов на экран. В консоли это будет выглядеть, например, следующим образом:
4 7 0 6 0 8
6 8 5 5 8 8
4 4 7 7 5 3
7 2 2 5 3 3
Метод сортировки массива по возрастанию
Здесь мы можем использовать уже имеющийся алгоритм сортировки массива методом пузырька, который можно увидеть здесь.
Реализация сортировки двумерного массива
Суть реализации сортировки двумерного массива, в зависимости от того, как сортируется массив, можно представить следующим образом:
- Создаем временный одномерный массив с количеством элементов равным количеству элементов в каждой строке (или каждом столбце) исходного массива.
- Сортируем временный массив
- Переносим отсортированные значения из временного массива в исходный массив.
Ниже представлена реализация этого алгоритма:
static void Main(string[] args)
{
int colCount = 6;//m
int rowCount = 5;//n
int[,] arr = GenerateArray(rowCount, colCount);
Console.WriteLine("Исходный массив");
PrintArray(arr);
Console.WriteLine("Сортировка по строкам: ");
int[] row = new int[colCount];
for (int i = 0; i < rowCount; i++)
{
for (int j = 0; j < colCount; j++)
row[j] = arr[i, j];
BubbleSort(row);
Insert(true, i, row, arr);
}
PrintArray(arr);
Console.WriteLine("Сортировка по столбцам: ");
int[] col = new int[rowCount];
for (int i = 0; i < colCount; i++)
{
for (int j = 0; j < rowCount; j++)
col[j] = arr[j, i];
BubbleSort(col);
Insert(false, i, col, arr);
}
PrintArray(arr);
}
public static void Insert(bool isRow, int dim, int[] source, int[,] dest)
{
for (int k = 0; k < source.Length; k++)
{
if (isRow)
dest[dim, k] = source[k];
else
dest[k, dim] = source[k];
}
}
здесь метод Insert — это вспомогательный метод с помощью которого мы меняем значения в стоке или столбце исходного массива на отсортированные значения.
Полный исходный код программы
Ниже представлен полный исходный код программы для сортировки двумерного массива методом пузырька:
using System;
namespace BabbleSort
{
internal class Program
{
static void Main(string[] args)
{
int colCount = 6;//m
int rowCount = 5;//n
int[,] arr = GenerateArray(rowCount, colCount);
Console.WriteLine("Исходный массив");
PrintArray(arr);
Console.WriteLine("Сортировка по строкам: ");
int[] row = new int[colCount];
for (int i = 0; i < rowCount; i++)
{
for (int j = 0; j < colCount; j++)
row[j] = arr[i, j];
BubbleSort(row);
Insert(true, i, row, arr);
}
PrintArray(arr);
Console.WriteLine("Сортировка по столбцам: ");
int[] col = new int[rowCount];
for (int i = 0; i < colCount; i++)
{
for (int j = 0; j < rowCount; j++)
col[j] = arr[j, i];
BubbleSort(col);
Insert(false, i, col, arr);
}
PrintArray(arr);
}
public static void Insert(bool isRow, int dim, int[] source, int[,] dest)
{
for (int k = 0; k < source.Length; k++)
{
if (isRow)
dest[dim, k] = source[k];
else
dest[k, dim] = source[k];
}
}
public static int[,] GenerateArray(int t, int i)
{
int[,] table = new int[t, i];
Random random = new Random();
for (int a = 0; a < t; a++)
{
for (int b = 0; b < i; b++)
{
table[a, b] = random.Next(0, 9);
}
}
return table;
}
public static void PrintArray(int[,] array)
{
for (int a = 0; a < array.GetLength(0); a++)
{
for (int b = 0; b < array.GetLength(1); b++)
{
Console.Write(array[a, b] + " ");
}
Console.WriteLine();
}
}
static void BubbleSort(int[] inArray)
{
for (int i = 0; i < inArray.Length; i++)
for (int j = 0; j < inArray.Length - i - 1; j++)
{
if (inArray[j] > inArray[j + 1])
{
int temp = inArray[j];
inArray[j] = inArray[j + 1];
inArray[j + 1] = temp;
}
}
}
}
}
Пример работы приложения представлен ниже:
6 2 7 7 3 3
4 2 5 0 4 3
8 8 5 5 6 5
4 0 6 2 1 1
7 1 7 7 2 4
Сортировка по строкам:
2 3 3 6 7 7
0 2 3 4 4 5
5 5 5 6 8 8
0 1 1 2 4 6
1 2 4 7 7 7
Сортировка по столбцам:
0 1 1 2 4 5
0 2 3 4 4 6
1 2 3 6 7 7
2 3 4 6 7 7
5 5 5 7 8 8
Итого
Для выполнения работы нам потребовались знания о том, как работать с одномерными и многомерными массивами в C#, как генерировать псевдослучайные числа в C#, а также основные сведения по методам сортировки одномерных массивов.