Проблема с сортировкой массива в C#
Пытаюсь сделать сортировку массива, при которой все нули должны остаться слева(в начале массива), а единицы должны оказаться справа(в конце массива).
Console.WriteLine("Please enter num");
int arraySize = Convert.ToInt32(Console.ReadLine());
Random rand = new Random();
int[] myArray = new int[arraySize];
for(int i = 0; i != myArray.Length; i++)
{
myArray[i] = rand.Next(0, 2);
Console.Write($"{myArray[i]} ");
}
Этот кусочек кода(код выше) просит ввести в консоль целое число, которое будет определять размер массива. Если число 5 то размер массива будет равен 5 int[5]. Далее этот массив заполняется случайными числами 0 или 1. И массив выводится в консоль.
int bottom = myArray.Length - 1;
for (int i = 0; i != myArray.Length; i++)
{
if(myArray[i] == 1)
{
for (int j = bottom; j != 0; j--)
{
if(myArray[j] == 0)
{
myArray[i] = 0;
myArray[j] = 1;
break;
}
}
}
}
for (int i = 0; i != myArray.Length; i++)
{
Console.Write($"{myArray[i]} ");
}
Console.ReadKey();
Данный кусочек выполняет сортировку массива. Сначала перебираем массив сначала и ищем единицу(1). Как только её нашли перебираем массив с конца в поисках нуля(0), нашли и поменяли местами. И так проделываем со всеми остальными числами и выводим массив.
ПРОБЛЕМНАЯ ЧАСТЬ В большинстве случаев последний элемент массива оказывается нулём(0), а должен быть единицей(1). В чём может быть прооблема??
Ответы (1 шт):
Видимо, проблема в том, что на последнем шаге мы нашли единицу в конце, после этого зачем-то ищем 0 в начале, и меняем их.
Ограничьте область поиска
for (int j = bottom; j > i; j--)
А ещё лучше завести правый и левый индексы, и, подобно процедуре разделения Хоара в быстрой сортировке, останавливаться, когда они сойдутся вместе. Набросок:
l = 0
r = myArray.Length - 1
while l < r
while myArray[l] = 0
l++
while myArray[r] = 1
r--
if l < r
myArray[l] = 0
myArray[r] = 1
l++
r--