В вашем коде есть пара проблем.
В цикле for
вы делаете:
int c = b++;
Однако это не делает то, что вы намереваетесь . Сначала он присваивает значение b
c
, а затем увеличивает b
на единицу. Это означает, что это увеличивает переменную for
-loop, и вы, по сути, пропускаете итерации , благодаря этому, в дополнение к тому факту, что значения c
и b
теперь "меняются местами".
Вместо этого вам нужно сделать следующее:
int c = b+1;
Это присваивает c
значение, большее b
, и оставляет b
без изменений.
В конце вы сравниваете два экземпляра массива:
if (changing_array == final_array)
Это не будет работать. Массивы являются ссылочными типами в C #, и это просто проверяет, указывают ли обе переменные на одно и то же место в памяти (чего они не делают). Вместо этого вы, вероятно, хотите SequenceEqual
:
if (changing_array.SequenceEqual(final_array))
Этот метод сравнивает элементы в двух массивах один за другим и возвращает true, только если оба имеют одинаковое содержимое.
После этих изменений цикл while
завершается.
Для вывода вы не можете передать массив в Console.WriteLine
напрямую. Этот метод может обрабатывать только простые типы данных и не знает, как вывести массив, поэтому вместо этого он просто записывает имя типа. Вместо этого вы должны превратить массив в целое число. Самым простым решением является метод string.Join
:
string.Join(",",starting_array)
Это создаст строку, содержащую элементы массива, разделенные запятой.
Полная версия вашего кода после следующих изменений:
int pass_count = 0;
bool sorted = false;
int[] changing_array = new int[5];
int[] final_array = new int[5];
int[] starting_array = new int[5];
for (int a = 0; a < 5; a++)
{
Console.WriteLine("Input number {0}", (a + 1));
changing_array[a] = Convert.ToInt32(Console.ReadLine());
}
Array.Copy(changing_array, final_array, 5);
Array.Copy(changing_array, starting_array, 5);
Array.Sort(final_array);
while (!sorted)
{
for (int b = 0; b < 4; b++)
{
int c = b+1;
int temp;
if (changing_array[b] > changing_array[c])
{
temp = changing_array[b];
changing_array[b] = changing_array[c];
changing_array[c] = temp;
}
else
{
continue;
}
}
pass_count++;
if (changing_array.SequenceEqual(final_array))
{
Console.WriteLine("It took {0} passes to sort \n{1} \ninto \n{2} ", pass_count, string.Join(",",starting_array), string.Join(",", final_array));
sorted = true;
}
else
{
Console.WriteLine("End of pass {0}. \n{1} \nis now \n{2} ", pass_count, string.Join(",", starting_array), string.Join(",", final_array));
}
}
Также обратите внимание, что я использовал !solved
вместо solved == false
. Оба варианта эквивалентны, но первая версия более широко используется и более краткая.