Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Сортировка массивов C#

Артем Самвелян Знаток (485), на голосовании 5 месяцев назад
Есть код на C#, который сортирует заданный ступенчатый массив из рандомных чисел построчно методом выбора:

class Program
{
static void Print(int[][] a)
{
for (int i = 0; i < a.Length; i++)
{
for (int j = 0; j < a[i].Length; j++)
{
Console.Write("{0} ", a[i][j]);
}
Console.WriteLine();

}
}
static void Input(out int[][] a)
{
Random rand = new Random();
Console.Write("n= ");
int n = int.Parse(Console.ReadLine());
Console.Write("m= ");
int m = int.Parse(Console.ReadLine());
a = new int[n][];
for (int i = 0; i < a.Length; i++)
{
a[i] = new int[m];
for (int j = 0; j < a[i].Length; j++)
{
Console.Write("a[{0}][{1}]= ", i, j);
a[i][j] = rand.Next (0,50);
}
}
}
static void Sort(int[] a)
{
int min;
int index;
int i, j;
for (i = 0; i < a.Length - 1; i++)
{
index = i;
min = a[i];
for (j = i + 1; j < a.Length; j++)
{
if (a[j] < min)
{
min = a[j];
index = j;
}
}
a[index] = a[i];
a[i] = min;
}
}


static void Main()
{
int[][] a;
Input(out a);
Console.WriteLine("Исходный массив:");
Print(a);
//сортируем каждую строку ступенчатого массива
foreach (int[] x in a)
{
Sort(x);
}

Console.WriteLine("Измененный массив:");
Print(a);
}
}

Как переделать его, чтобы он сортировал диагонали выше главной - по убыванию, а ниже - по возрастанию?
Голосование за лучший ответ
Терпеливая Граната Мыслитель (6215) 6 месяцев назад
Для того, чтобы реализовать сортировку диагоналей в заданном порядке (выше главной - по убыванию, ниже - по возрастанию), вы можете использовать следующий алгоритм:

1. Выделить все диагонали в массиве.
2. Отсортировать каждую диагональ в соответствии с заданным порядком.
3. Вернуть измененный массив.

Вот пример реализации этого алгоритма в C#:

```csharp
class Program
{
static void Print(int[][] a)
{
for (int i = 0; i < a.Length; i++)
{
for (int j = 0; j < a[i].Length; j++)
{
Console.Write("{0} ", a[i][j]);
}
Console.WriteLine();
}
}

static void Input(out int[][] a)
{
Random rand = new Random();
Console.Write("n= ");
int n = int.Parse(Console.ReadLine());
Console.Write("m= ");
int m = int.Parse(Console.ReadLine());
a = new int[n][];
for (int i = 0; i < a.Length; i++)
{
a[i] = new int[m];
for (int j = 0; j < a[i].Length; j++)
{
a[i][j] = rand.Next (0, 50);
}
}
}

static void SortDiagonals(int[][] a)
{
int n = a.Length;
int m = a[0].Length;

// Выделение диагоналей
List<List<int>> diagonals = new List<List<int>>();
for (int i = 0; i < n + m - 1; i++)
{
List<int> diagonal = new List<int>();
for (int j = 0; j <= i; j++)
{
int x = i - j;
int y = j;
if (x < n && y < m)
{
diagonal.Add(a[x][y]);
}
}
diagonals.Add(diagonal);
}

// Сортировка диагоналей
for (int i = 0; i < diagonals.Count; i++)
{
if (i < n - 1)
{
// Сортировка по убыванию для диагоналей выше главной
diagonals[i].Sort((x, y) => y.CompareTo(x));
}
else
{
// Сортировка по возрастанию для диагоналей ниже главной
diagonals[i].Sort();
}
}

// Возврат измененного массива
for (int i = 0; i < n + m - 1; i++)
{
int index = 0;
for (int j = 0; j <= i; j++)
{
int x = i - j;
int y = j;
if (x < n && y < m)
{
a[x][y] = diagonals[i][index++];
}
}
}
}

static void Main()
{
int[][] a;
Input(out a);
Console.WriteLine("Исходный массив:");
Print(a);

SortDiagonals(a);

Console.WriteLine("Измененный массив:");
Print(a);
}
}
```

В этом коде мы сначала выделяем все диагонали в массиве и сортируем их в соответствии с заданным порядком. Затем мы возвращаем изменённый массив.

Обратите внимание, что эта реализация имеет сложность O(n^2 * log(n)), где n - максимальная длина строки/столбца в массиве, так как мы сортируем каждую диагональ.
Артем СамвелянЗнаток (485) 6 месяцев назад
Спасибо большое, вы очень сильно мне помогли
Похожие вопросы