2015-12-19 14 views
5

オーケーで、私は整数の選択ソートを行うには、このコードを使用してきた:C#の選択ソート列

public void selectSort(int [] arr) 
{ 
    //pos_min is short for position of min 
    int pos_min,temp; 

    for (int i=0; i < arr.Length-1; i++) 
    { 
     pos_min = i; //set pos_min to the current index of array 

     for (int j=i+1; j < arr.Length; j++) 
     { 
      if (arr[j] < arr[pos_min]) 
      { 
       //pos_min will keep track of the index that min is in, this is needed when a swap happens 
       pos_min = j; 
      }           
     } 

     //if pos_min no longer equals i than a smaller value must have been found, so a swap must occur 
     if (pos_min != i) 
     { 
      temp = arr[i]; 
      arr[i] = arr[pos_min]; 
      arr[pos_min] = temp; 
     } 
    } 
} 

が、今私の代わりに文字列リストに同じアルゴリズムを実行したいです。
これはどのように達成できますか?それは本当に扱いにくいと感じ、あなたは別の文字列の複数の文字を比較するために追加のループが必要なようです..?
私はたくさん試しましたが、何か役に立つものを考え出すことができませんでした。 :/

注: 私が知っている選択ソートはあまり効率的ではありません。これは学習目的のためのものです。私はすでにC#の一部である代わりのアルゴリズムやクラスを探していません。 ;)

+0

しかし、文字列にも '<', '> '、' == '、'!= 'などの演算子を使用できます。文字をループする必要はありません。 –

+0

あなたが探しているものは本当にわかりません。組み込みの文字列比較を使用できない場合は、文字を比較するためのfor-loopを書く必要があります。 –

答えて

8

整数の配列に対して選択ソートが実装されたので、任意のタイプの配列で動作するようにソリューションを一般化する必要があります。これはジェネリックスとIComparableインターフェイスで行うことができます。

ジェネリックスを使用すると、型を持つ関数をパラメータ化できます。これは、関数を値でパラメータ化する方法と似ています。

IComparableは、比較演算子であるCompareToという関数を私たちに提供するインターフェイスです。この演算子は、整数と文字列の両方を含むIComparableインターフェースを実装するすべてのタイプで使用できます。

// Forall types A where A is a subtype of IComparable 
public void selectSort<A>(A[] arr) 
where A : IComparable 
{ 
    //pos_min is short for position of min 
    int pos_min,temp; 

    for (int i=0; i < arr.Length-1; i++) 
    { 
     pos_min = i; //set pos_min to the current index of array 

     for (int j=i+1; j < arr.Length; j++) 
     { 
      // We now use 'CompareTo' instead of '<' 
      if (arr[j].CompareTo(arr[pos_min]) < 0) 
      { 
       //pos_min will keep track of the index that min is in, this is needed when a swap happens 
       pos_min = j; 
      }           
     } 

     //if pos_min no longer equals i than a smaller value must have been found, so a swap must occur 
     if (pos_min != i) 
     { 
      temp = arr[i]; 
      arr[i] = arr[pos_min]; 
      arr[pos_min] = temp; 
     } 
    } 
} 
+0

恐ろしい!どうもありがとうございます。 :)私は少し混乱しています。階層は単純にユニコードテーブルの文字のインデックスによって決定されますか?私はどのような順序でこれらの文字列がソートされるのだろうかと思っています: "aa" - "äb" - "ac"と "ea" - "éb" - "ec" – Forivin

+0

あなたはそれらを試してみることができます。また、[String.CompareTo](https://msdn.microsoft.com/en-us/library/35f0x18w(v = vs.110).aspx)のドキュメントを参照することもできます。 – erisco

2

クラスの静的int Compare(string, string)クラスは、最初の文字列が2番目の文字列よりも小さい場合は負の数を返し、等しい場合は0を返し、1番目の文字列が大きい場合は正の整数を返します。

"小さい"とは、それが語彙的順序で他のものの前に来ることを意味し、より大きなものは、それが字句的順序で後に来ることを意味する。

したがって、arr[j] < arr[pos_min]の代わりにString.Compare(arr[j], arr[pos_min]) < 0を整数と比較することができます。