Описать процедуру sort(x), упорядочивающую по неубыванию числа массива x - C#
Формулировка задачи:
Вот само задание: Описать процедуру sort(x), упорядочивающую по неубыванию числа массива x следующим методом: все числа из x упорядочить по последней цифре и перенести во вспомогательный массив y; затем числа из y упорядочить по предпоследней цифре (при равенстве этих цифр сохранять упорядоченность по последней цифре) и записать их снова в массив x; далее числа из x упорядочить по третьей от конца цифре и перенести в массив y и т.д. (Учесть, что в конце концов числа должны оказаться в x).
Вот код: Проблема возникла, когда цифры совпадают и он не сортирует по предыдущей цифре, хотел проблему решить так Но не получилось, помогите пожалуйста с этим. О массива cop, в 0 строку записываются числа, в строку 1 записывается целое число от деления на 10, в строку 2 записывается остаток от деления на 0. Заранее спасибо.
static int[] mas = { 132, 321, 123, 213,231 , 312 };
static int[] x = new int[mas.Length];
static int[] y = new int[mas.Length];
static int maxцифрвчисле = new int();
#region Вывод
static void V(int[,] cop)
{
for (int i = 0; i < mas.Length; i++)
{
Console.Write(cop[0, i] + "\t");
}
Console.WriteLine();
for (int i = 0; i < mas.Length; i++)
{
Console.Write(cop[1, i] + "\t");
}
Console.WriteLine();
for (int i = 0; i < mas.Length; i++)
{
Console.Write(cop[2, i] + "\t");
}
Console.WriteLine();
}
#endregion
/*
* По убыванию
* 16.Описать процедуру sort(x), упорядочивающую по неубыванию числа массива x следующим методом: все числа из x упорядочить по
* последней цифре и перенести во вспомогательный массив y; затем числа из y упорядочить по предпоследней цифре (при равенстве этих
* цифр сохранять упорядоченность по последней цифре) и записать их снова в массив x; далее числа из x упорядочить по третьей от конца
* цифре и перенести в массив y и т.д. (Учесть, что в конце концов числа
* должны оказаться в x).
*/
static void Main(string[] args)
{
Console.WriteLine(123 / 10%10);
int[,] cop = new int[3, mas.Length];
for(int i=0; i<mas.Length; i++)
{
cop[0,i]=mas[i];
cop[1, i] = mas[i] / 10;
cop[2, i] = mas[i]%10;
if (mas[i].ToString().Length > maxцифрвчисле)
maxцифрвчисле = mas[i].ToString().Length;
}
#region Сортировка по последней цифре
int temp;
for (int z = 0; z < maxцифрвчисле; z++)
{
for (int j = 0; j < mas.Length; j++)
{
for (int i = 0; i < mas.Length; i++)
{
if (i == j)
break;
if (cop[2, i] < cop[2, j])
{
temp = cop[2, i];
cop[2, i] = cop[2, j];
cop[2, j] = temp;
temp = cop[0, i];
cop[0, i] = cop[0, j];
cop[0, j] = temp;
temp = cop[1, i];
cop[1, i] = cop[1, j];
cop[1, j] = temp;
V(cop);
}
int io = 1;
if (cop[2, i] == cop[2, j])
{
for (int p = z; p >= 0; p--)
io *= 10;
if (cop[0, j] / io % io < cop[0, i] / io % io && cop[1, i].ToString().Length!=2)
{
temp = cop[2, i];
cop[2, i] = cop[2, j];
cop[2, j] = temp;
temp = cop[0, i];
cop[0, i] = cop[0, j];
cop[0, j] = temp;
temp = cop[1, i];
cop[1, i] = cop[1, j];
cop[1, j] = temp;
}
}
}
}
Console.WriteLine();
for (int i = 0; i < mas.Length;i++ )
{
cop[1, i] /= 10;
cop[2, i] = cop[1, i] % 10;
}
V(cop);
}
#endregion
//Запись в y
for (int i = 0; i < mas.Length; i++)
y[i] = cop[0, i];
Console.ReadKey(true);
}int io = 1;
if (cop[2, i] == cop[2, j])
{
for (int p = z; p >= 0; p--)
io *= 10;
if (cop[0, j] / io % io < cop[0, i] / io % io && cop[1, i].ToString().Length!=2)
{
temp = cop[2, i];
cop[2, i] = cop[2, j];
cop[2, j] = temp;
temp = cop[0, i];
cop[0, i] = cop[0, j];
cop[0, j] = temp;
temp = cop[1, i];
cop[1, i] = cop[1, j];
cop[1, j] = temp;
}
}Решение задачи: «Описать процедуру sort(x), упорядочивающую по неубыванию числа массива x»
textual
Листинг программы
using System;
using System.Collections.Generic;
namespace ConsoleApplication7
{
class Arrays
{
public void Sort(int[] x)
{
Console.WriteLine("Исходный массив X:");
PrintArray(x);
int[] y = x;
Array.Sort(y, new MyClass());
Console.WriteLine("Массив Y:");
PrintArray(y);
x = y;
Array.Sort(x, new MyClass2());
Console.WriteLine("Массив X:");
PrintArray(x);
Console.WriteLine("Массив Y:");
y = x;
Array.Sort(y,new MyClass3());
PrintArray(y);
}
private void PrintArray(IEnumerable<int> array)
{
foreach (var a in array)
{
Console.Write(a + " ");
}
Console.WriteLine();
Console.WriteLine();
}
}
sealed class MyClass : IComparer<int>
{
public int Compare(int x, int y)
{
int l = x % 10;
int l1 = y % 10;
if (l == l1)
return 0;
if (l < l1)
return -1;
return 1;
}
}
sealed class MyClass2 : IComparer<int>
{
public int Compare(int x, int y)
{
int r = x / 10 % 10;
int r2 = y / 10 % 10;
if (r < r2)
return -1;
if (r > r2)
return 1;
int l = x % 10;
int l1 = y % 10;
if (l == l1)
return 0;
if (l < l1)
return -1;
return 1;
}
}
sealed class MyClass3 : IComparer<int>
{
public int Compare(int x, int y)
{
int l = x / 100;
int l1 = y / 100;
if (l == l1)
return 0;
if (l < l1)
return -1;
return 1;
}
}
class Program
{
static void Main(string[] args)
{
var arr = new int[] { 123, 941, 228, 303, 494, 108 };
new Arrays().Sort(arr);
Console.ReadKey(true);
}
}
}