2017-04-25 1 views
0

マージ私は、ソート、文字列内のようなルックスをソートするarray.Theデータ600個のアイテムを扱うことになるプログラムの検索配列をプログラムしようとしています

2017 | 25 | 1月| 9994750 | 27.640 | 36.800 |ドデカンゼ諸島、ギリシャ| 1485307173 | 01:19:33 | 4.000 |

このデータをソートするためにマージソートを実装しようとしています。しかし、私はint配列用に設計されたマージソートプログラムを文字列配列をソートするために設計されたものに変換する方法を理解することができません。どのように私はこれを行うことができるか誰も説明できますか?

これは既存の組み込み関数を使用して行うことができますが、私は来年度の大学のコースワークに備えてこれを試していますので、マージソートをゼロから作成し、組み込み関数を使用しないでください。

サイドノート:現在の形式では、プログラムはマージソートでも自然に何ヶ月もソートできないことに気づく必要がありますが、これはすでにマージソートの動作を得ることができます思惑通り。

現在のマージソートプログラム:

 static public void MainMerge(string[] numbers, int left, int mid, int right) 
    { 
     int[] temp = new int[25]; 
     int i, eol, num, pos; 

     eol = (mid - 1); 
     pos = left; 
     num = (right - left + 1); 

     while ((left <= eol) && (mid <= right)) 
     { 
      if (numbers[left].CompareTo(numbers[mid])) 
       temp[pos++] = numbers[left++]; 
      else 
       temp[pos++] = numbers[mid++]; 
     } 

     while (left <= eol) 
      temp[pos++] = numbers[left++]; 

     while (mid <= right) 
      temp[pos++] = numbers[mid++]; 

     for (i = 0; i < num; i++) 
     { 
      numbers[right] = temp[right]; 
      right--; 
     } 
    } 

    static public void SortMerge(string[] numbers, int left, int right) 
    { 
     int mid; 

     if (right > left) 
     { 
      mid = (right + left)/2; 
      SortMerge(numbers, left, mid); 
      SortMerge(numbers, (mid + 1), right); 

      MainMerge(numbers, left, (mid + 1), right); 
     } 
    } 
+0

コードを再利用しようとすると、しばしばそれは価値があるものです。それはあなたが一から始めようとするほうがはるかに簡単な作業のようです。 – coinbird

+0

@coinbird何ですか?これは、ジェネリックスを使用して非常に簡単です。 "最初から開始する"理由はありません – Amy

+0

IComparableを実装するジェネリックを使用してソートを実装する必要があります。 'public void MergeSort (このT []要素)ここでT:IComparable {}' –

答えて

2

は、あなたのアルゴリズムは、異なる種類を操作できるようにするためには、我々はC#ジェネリックを使用します。 、型制約を追加しましたstringからT

  • に配列のデータ型を変更し、より良い他の変更
  • に合わせて、valuesnumbersパラメータを改名

    • :私はあなたのコードに次の変更を行いましただからTは他と匹敵する必要があります
    • tempの配列のタイプをTに変更しました。
    • あなたはすでにあなたの比較を行うためにCompareToを使用しているので、他のコードの変更が編集必要ありません。実際、IComparable.CompareTostring.CompareToとは異なる戻り値を持っているので、小さな調整がを行うことが必要になります。

    IComparableの代わりにIComparable<T>を使用しました。あなたの目的に合わせてどちらも同じように機能するはずです。

    コードは次のとおりです。あなたはその後、自分自身に匹敵する任意の型の配列でこれを呼び出すことができます

    static public void MainMerge<T>(T[] values, int left, int mid, int right) where T : IComparable<T> 
    { 
        T[] temp = new T[25]; 
        int i, eol, num, pos; 
    
        eol = (mid - 1); 
        pos = left; 
        num = (right - left + 1); 
    
        while ((left <= eol) && (mid <= right)) 
        { 
         if (values[left].CompareTo(values[mid])) 
          temp[pos++] = values[left++]; 
         else 
          temp[pos++] = values[mid++]; 
        } 
    
        while (left <= eol) 
         temp[pos++] = values[left++]; 
    
        while (mid <= right) 
         temp[pos++] = values[mid++]; 
    
        for (i = 0; i < num; i++) 
        { 
         values[right] = temp[right]; 
         right--; 
        } 
    } 
    
    static public void SortMerge<T>(T[] values, int left, int right) where T : IComparable<T> 
    { 
        int mid; 
    
        if (right > left) 
        { 
         mid = (right + left)/2; 
         SortMerge(values, left, mid); 
         SortMerge(values, (mid + 1), right); 
    
         MainMerge(values, left, (mid + 1), right); 
        } 
    } 
    

    intとは両方とも正常に動作するはずです。

  • +0

    うまくいくようです。何らかの理由で、.CompareTo部分が "暗黙のうちに_int_を_bool_に変換できません"というエラーをスローします。 – GiggyLapisar

    +0

    @GiggyLapisar 'CompareTo'は、項目が等しい場合は' 0'を返し、左の項目が最初にソートされる場合は-1を返し、最初に正しい項目がソートされる場合は-1を返します。したがって、適切な整数と比較してください。私は*あなたが条件に '<0'を加えるべきだと思う。申し訳ありませんが、私はatmを利用できるエディタを持っていません。 'if(values [left] .CompareTo(values [mid])<0 'でなければなりません。 * – Amy

    +0

    @GiggyLapisar [備考]を参照してください(https://msdn.microsoft.com/en-us/library/4d7sx9hd(v = vs.110).aspx) – Amy

    関連する問題