Как исправить мой пузырьковый код сортировки для моего массива с плавающей точкой из текстового файла, содержащего десятичные значения - PullRequest
0 голосов
/ 04 апреля 2019

Я использую алгоритм пузырьковой сортировки для сортировки списка значений с плавающей точкой, полученных из текстового файла.Этот код сортировки пузырьков работает для других массивов, но не для этого;он отображает только первое значение в текстовом файле.

Я использовал эту пузырьковую сортировку на существующих массивах, и она работает, но она не работает для моего массива с плавающей точкой, который я преобразовал из строки.Почему это не работает? `

while(line != null)
{
    int temp = 0;

    for (int write = 0; write < x.Length; write++)
    {
        for (int sort = 0; sort < x.Length - 1; sort++)
        {
            if (x[sort] > x[sort + 1])
            {
                temp = (int)x[sort + 1];
                x[sort + 1] = x[sort];
                x[sort] = temp;
            }
        }
    }

    for (int i = 0; i < x.Length; i += 1)
    {
        Console.Write(x[i] + " ");
    }

    line = br.ReadLine();
    Console.ReadKey();
}

Вот код для преобразования строки в значение x:

 string line = br.ReadLine();
 float [] x = Array.ConvertAll(line.Split(','), float.Parse);

Вот код, выполняющий преобразование файла:

            using (StreamReader br = new StreamReader("file.txt"))

1 Ответ

1 голос
/ 04 апреля 2019

Кроме того факта, что вы можете получить массив по порядку с одной строкой (Array.Sort (x), который использует более эффективную быструю сортировку), то, что у вас есть (1), не является сортировкой пузырьков и (2)) будет правильно работать только для целых чисел.Ваша временная переменная подкачки является целым числом, поэтому при свопировании значения всегда будут преобразованы в целое число.Вам нужно что-то вроде:

   public class BubbleSort<T> where T : IComparable<T>
   {
      public static T[] Sort(T[] array)
      {
         for (var i = array.Length - 1; i > 0; i--)
         {
            for (var j = 0; j < i; j++)
            {
               if (((IComparable<T>)array[j]).CompareTo(array[j + 1]) > 0)
               {
                  var swapVar = array[j + 1];
                  array[j + 1] = array[j];
                  array[j] = swapVar;
               }
            }
         }
         return array;
      }
   }

Используйте это так:

BubbleSort<float>.Sort(x);

после загрузки массива (X) в память.Обратите внимание, что он может сортировать массив всего, что можно сравнить с его собственным (в данном случае это float).

Слегка изменяя вещи:

   public static class BubbleSort
   {
      public static T[] Sort<T>(T[] array) where T : IComparable<T>
      {
         for (var i = array.Length - 1; i > 0; i--)
         {
            for (var j = 0; j < i; j++)
            {
               if (((IComparable<T>)array[j]).CompareTo(array[j + 1]) > 0)
               {
                  var swapVar = array[j + 1];
                  array[j + 1] = array[j];
                  array[j] = swapVar;
               }
            }
         }
         return array;
      }
   }

Будет автоматически выводить тип массиватак что

BubbleSort.Sort(x);

будет работать

...