Получение неправильного результата при сортировке массивов

#c# #arrays #sorting

#c# #массивы #сортировка

Вопрос:

Я практикую C # и написал приведенный ниже код, исключив строку, начинающуюся « Array.Sort ….». Результат был таким, как ожидалось (т. Е. «5,7,2,»).

Когда я включил строку « Array.Sort …» Я ожидал получить «2,5,7», но получил результат «5,5,7», т. е. 2 исчезло и каким-то образом было заменено на 5. Кто-нибудь может помочь объяснить, почему (новичку)?

 namespace ConsoleApplication33
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] numbers = new int[3] { 5, 7, 2 };

            for (int i = 0; i< numbers.Length; i  )
            {
                Console.Write(numbers[i]   " , ");
                Array.Sort(numbers);

            }
            Console.ReadKey();
        }

    }
}
  

Ответ №1:

Вам не нужен for цикл для сортировки. Просто Array.Sort следует отсортировать ваш массив:

 int[] numbers = new int[3] { 5, 7, 2 };
Array.Sort(numbers);
  

После того, как вы отсортировали массив, вы можете распечатать отсортированный массив следующим образом:

 for (int i = 0; i< numbers.Length; i  ) {
    Console.Write(numbers[i]   " , ");
}
  

Ответ №2:

Вы выполняете сортировку в цикле, предварительно записывая i значение. Итак, ваш код работает следующим образом

  • Напишите первый элемент (5)
  • Отсортируйте массив
  • Напишите второй элемент (теперь 5)
  • Отсортируйте массив
  • Напишите третий пункт (теперь 7).

Вероятно, вы хотели отсортировать массив, а затем записать его:

 int[] numbers = new int[3] { 5, 7, 2 };

Array.Sort(numbers);

for (int i = 0; i< numbers.Length; i  )
{
    Console.Write(numbers[i]   " , ");
}
  

Кроме того, вы также могли бы использовать string.Join и избежать цикла (и завершающей запятой):

 var commaSeparatedNums = string.Join(", ", numbers);
Console.Write(commaSeparatedNums);
  

Ответ №3:

Array.sort — это метод, который не требует какой-либо итерации цикла,, просто вызвать его более чем достаточно

ваша проблема вызвана тем, что вы выполняете цикл И сортировку 3 раза, что совершенно не нужно … теперь вы берете элемент в позиции i, затем сортируете и делаете это 3 раза… посмотрите на анимацию для более наглядного объяснения

введите описание изображения здесь вы сортируете правильно, но считываете элементы массива по индексу, что неверно и не обязательно

удалите цикл hole for и просто вызовите Array.Sort(numbers);

 //for (int i = 0; i< numbers.Length; i  )
//{
     //Console.Write(numbers[i]   " , ");
     Array.Sort(numbers);
//}
  

Ответ №4:

Вы сортируете массив в цикле. Сортировка изменяет массив только при первом применении; второй и третий вызовы сортировки не вносят изменений в массив.

Первая распечатка выполняется для несортированного массива; вторая распечатка выполняется для отсортированного массива. В первый раз 5 это начальное число; во второй раз 5 находится в середине. Вот почему вы видите, что 5 напечатано дважды.

Вам нужно отсортировать массив один раз перед запуском цикла печати, чтобы устранить эту проблему:

 Array.Sort(numbers);
for (int i = 0; i< numbers.Length; i  ) {
    Console.Write(numbers[i]   " , ");
}
  

Комментарии:

1. Спасибо всем. Теперь я понимаю это, следуя вашим объяснениям. Спасибо за помощь 🙂

Ответ №5:

Используйте Array.Сортировка без цикла. Если вы хотите отсортировать массив.

 int[] numbers = new int[3] { 5, 7, 2 };
Array.Sort(numbers);