Сортировка шести чисел от большего к меньшему минимальным количеством перестановок - C#
Формулировка задачи:
Шесть чисел (4 6 7 2 3 5) нужно отсортировать от большего к меньшему минимальным количеством перестановок.
есть три перестановки
1) меняются 1-4 становятся задом на перед (2 7 6 4 3 5)
2) меняются 2-5 становятся задом на перед (4 3 2 7 6 5)
3) меняются 3-6 становятся задом на перед (4 6 5 3 2 7)
Как организовать логику программы? что бы находило минимальное количество перестановок... У меня программа зацикливается... Идет тупо рандомный перебор ...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace military
{
class Program
{
static int n = 6;
static int buf = 6;
static int[] solder = new int[6];
static int[] solder_no = new int[6];
static Random zapusk = new Random();
static void func_1()
{
/*Console.WriteLine(" ");
for (int i = 0; i < n; i++)
{
Console.Write(solder_no[i] + " ");
}
Console.WriteLine(" ");*/
int memory;
memory = solder_no[3];
solder_no[3] = solder_no[0];
solder_no[0] = memory;
memory = solder_no[2];
solder_no[2] = solder_no[1];
solder_no[1] = memory;
/*for (int i = 0; i < n; i++)
{
Console.Write(solder_no[i] + " ");
}*/
}
static void func_2()
{
/*Console.WriteLine(" ");
for (int i = 0; i < n; i++)
{
Console.Write(solder_no[i] + " ");
}
Console.WriteLine(" ");*/
int memory;
memory = solder_no[4];
solder_no[4] = solder_no[1];
solder_no[1] = memory;
memory = solder_no[3];
solder_no[3] = solder_no[2];
solder_no[2] = memory;
/*for (int i = 0; i < n; i++)
{
Console.Write(solder_no[i] + " ");
}*/
}
static void func_3()
{
/*Console.WriteLine(" ");
for (int i = 0; i < n; i++)
{
Console.Write(solder_no[i] + " ");
}
Console.WriteLine(" ");*/
int memory;
memory = solder_no[5];
solder_no[5] = solder_no[2];
solder_no[2] = memory;
memory = solder_no[4];
solder_no[4] = solder_no[3];
solder_no[3] = memory;
/*for (int i = 0; i < n; i++)
{
Console.Write(solder_no[i] + " ");
}*/
}
static void enter_solder()
{
for (int i = 0; i < n; i++)
{
try
{
Console.ForegroundColor = ConsoleColor.Gray;
Console.WriteLine("число " + (i + 1) + "");
solder[i] = Convert.ToInt32(Console.ReadLine());
solder_no[i] = solder[i];
Console.Clear();
if (solder[i] >= 250)
{
Console.Clear();
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("число больше допустимого.");
i = i - 1;
}
}
catch
{
Console.Clear();
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("это не число.");
i = i - 1;
}
}
}
static void sort()
{
for (int k = n - 1; k > 0; k--)
for (int i = 0; i < k; i++)
if (solder[i] < solder[i + 1])
{
buf = solder[i];
solder[i] = solder[i + 1];
solder[i + 1] = buf;
}
for (int i = 0; i < n; i++)
Console.Write(solder[i]+ " ");
Console.ReadKey();
}
static void progs()
{
for (int i = 0; i < n; i++)
if (Array.Equals(solder, solder_no))
{
i = 6;
for (int j = 0; j < n; j++)
{
Console.WriteLine("solder_no[j]");
}
}
else
{
i = i - 1;
switch (zapusk.Next(0, 3))
{
case 0:
Console.WriteLine("1");Ut
func_1();
break;
case 1:
Console.WriteLine("2");
func_2();
break;
case 2:
Console.WriteLine("3");
func_3();
break;
}
}
Console.ReadKey();
}
static void Main(string[] args)
{
enter_solder();
sort();
Console.Clear();
progs();
}
}
}Решение задачи: «Сортировка шести чисел от большего к меньшему минимальным количеством перестановок»
textual
Листинг программы
using System;
namespace AdvSort
{
class Exec
{
static int IndexOfMax(int[] buffer, int offset, int count)
{
var result = offset;
var max = buffer[result];
for (var i = offset + 1; i < offset + count; i++)
if (buffer[i] >= max)
{
result = i;
max = buffer[i];
}
return result;
}
static void Swap(ref int a, ref int b)
{
int c = a;
a = b;
b = c;
}
static int SwapSort(int[] buffer)
{
var replCount = 0;
int maxIndex;
for (var i = 0; i < buffer.Length - 1; i++)
{
maxIndex = IndexOfMax(buffer, i + 1, buffer.Length - i - 1);
if (buffer[maxIndex] > buffer[i])
{
Swap(ref buffer[i], ref buffer[maxIndex]);
replCount++;
}
}
return replCount;
}
static int Main(string[] args)
{
int[] arr = { 2, 1, 2, 2};
int replCount = SwapSort(arr);
Console.WriteLine("Выполнено {0} swap операций.", replCount);
Console.ReadKey();
return 0;
}
}
}