2015-04-11 7 views
0

Я пытаюсь реализовать сортировку Insertion в одной из моих программ. То, что я пытался создать, - это программа сортировки (как в порядке возрастания, так и в порядке убывания). Однако я попытался с такими алгоритмами, как quicksort и merge-sort, я действительно новичок в C# и кодировании. Проблема, с которой я столкнулся, заключается в том, что мои файлы включают в себя как строку кода, так и двойное/целое число (пример: 75.350, 74.430, четверг, пятница), и поскольку этот алгоритм предназначен для целых чисел. Есть ли способ его конвертировать, пожалуйста?Алгоритм сортировки вставки C#

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.IO; 

namespace ConsoleApplication3 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      StreamReader sh1Open = new StreamReader("c:..\\Files\\SH1_Open.txt"); 
      string Sh1OpenString = sh1Open.ReadToEnd(); 


      int[] x = { Convert.ToInt32(Sh1OpenString) }; 
      int j; 
      int temp; 

      for (int i = 1; i < x.Length; i++) 
      { 
       j = i - 1; 

       while (j >= 0 && x[j]>x[j+1]) 
       { 
        temp = x[j]; 
        x[j] = x[j + 1]; 
        x[j + 1] = temp; 

        j = j - 1; 
       } 
      } 

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

      Console.ReadKey(); 

     } 
    } 
} 
+2

Как бы вы отсортировали целое число 123 и строку «123». Что такое «больше»? – DrKoch

+0

Эта строка является фиктивной: 'int [] x = {Convert.ToInt32 (Sh1OpenString)};' возвращает единственную строку для полного файла в массиве int с одним элементом. – DrKoch

+0

Вы можете преобразовать все в строку (используя метод ToString), а затем отсортировать их как строки – kskyriacou

ответ

2

Лучший способ, вероятно, использовать общий метод с ограничением IComparable.

T[] InsertionSort(T[] x) where T : IComparable<T> 
{ 
    for (int i = 0; i < x.Length-1; i++) 
    { 
     int j = i+1; 

     while (j>0) 
     { 
      if (x[j-1].CompareTo(x[j]) > 1) 
      { 
       T temp = x[j-1]; 
       x[j - 1] = x[j]; 
       x[j] = temp; 

      } 
      j--; 
     } 
    } 

    return x; 
} 

или с использованием алгоритма из http://www.codecodex.com/wiki/Insertion_sort

static void InsertSort(IComparable[] array) 
{ 
    int i, j; 

    for (i = 1; i < array.Length; i++) 
    { 
     IComparable value = array[i]; 
     j = i - 1; 
     while ((j >= 0) && (array[j].CompareTo(value) > 0)) 
     { 
      array[j + 1] = array[j]; 
      j=j-1; 
     } 
     array[j + 1] = value; 
    } 
} 

Кроме того, есть, вероятно, ошибка в этой строке:

int[] x = { Convert.ToInt32(Sh1OpenString) }; 

, потому что вы пытаетесь преобразовать весь файл в один целое.

+0

Спасибо за помощь! Я еще не пробовал свой код (немного занят, но я это сделаю). Я понял, что строка кода является ошибкой - что я могу ее изменить? Или просто стоит изменить весь мой код? :) – Yrneh

+0

Я предпочел бы использовать дополнительный параметр 'IComparer ' ('Comparer .Default', если он не требуется.), Чем ограниченные элементы для 'IComparable' в первом примере кода - вот как' Словари' и другие подобные конструкции Работа. И массив «IComparable» во втором примере заставит вас применять много бокс-распаковки со значениями типов (вы можете 'IComparable [] comp = new String [] {}', но не может 'IComparable [] comp = new Int [] {} '). –

+0

@Yrneh Это зависит от структуры вашего файла. Если ваши значения разделены запятыми, самым простым способом является вызов 'Sh1OpenString.Split (новый char [] {','});' ([MSDN] (https://msdn.microsoft.com/pl-pl/library /b873y76a%28v=vs.110%29.aspx)). Затем вам придется перебирать возвращаемый массив и вызывать метод «ToInt32» для каждого элемента. @EugenePodskal Да, вы правы, особенно о втором примере, но @Yrneh является новым для C#, и я не хотел слишком усложнять ситуацию. –

0

Поскольку в C# операторы сравнения определены для string с вы могли бы просто заменить все соответствующие int переменные с string переменными. Алгоритм должен работать одинаково (хотя и немного медленнее)

Смежные вопросы