2017-05-05 24 views
1

現在のところ、私のクイックソートアルゴリズムは、ケース1の昇順で配列をソートしますが、ユーザがオプション2(ケース2)を選択すると、降順で配列がソートされるようにしたいと考えています。それぞれの場合に2つの別個のアルゴリズムを作成する必要がありますか?または、より簡単で効率的な方法がありますか?クイックソートアルゴリズムでは、配列を昇順と降順の両方で並べ替えることができますか?

ヘルプを評価してください。

static void Main(string[] args) 
    { 
     Console.WriteLine("Analysis of Seismic Data.\n"); 



     Console.WriteLine("Selection of Arrays:"); 
     //Display all the options. 
     Console.WriteLine("1-Year"); 
     Console.WriteLine("2-Month"); 
     Console.WriteLine("3-Day"); 
     Console.WriteLine("4-Time"); 
     Console.WriteLine("5-Magnitude"); 
     Console.WriteLine("6-Latitude"); 
     Console.WriteLine("7-Longitude"); 
     Console.WriteLine("8-Depth"); 
     Console.WriteLine("9-Region"); 
     Console.WriteLine("10-IRIS_ID"); 
     Console.WriteLine("11-Timestamp\n\n"); 

     Console.WriteLine("Use numbers to select options."); 
     //Read in user's decision. 
     Console.Write("Select which array is to be analysed:"); 
      int userDecision = Convert.ToInt32(Console.ReadLine()); 

     //Selected which array is to be analyzed 
      switch (userDecision) 
      { 
       case 1: 
        Console.WriteLine("\nWould you like to sort the Array in Ascending or Descending order?"); 
        Console.WriteLine("1-Ascending"); 
        Console.WriteLine("2-Descending"); 
        //Create another switch statement to select either ascending or descending sort. 
        int userDecision2 = Convert.ToInt32(Console.ReadLine()); 
        switch (userDecision2) 
        { 
         case 1: 
         //Here algorithm sorts my array in ascending order by default. 
         QuickSort(Years); 
         Console.WriteLine("Contents of the Ascending Year array: "); 
         foreach (var year in Years) 
         { 
          Console.WriteLine(year); 
         } 
         break; 
         case 2: 
         //How do I sort the same array in Descending order when Option 2 is selected? 
         //QuickSort(Years) Descendingly. 
          Console.WriteLine("Contents of the Descending Year array: "); 
          foreach (var year in Years) 
          { 
           Console.WriteLine(year); 
          } 
          break; 

        } 
        break; 
       case 2: 
        Console.WriteLine("\nWould you like to sort the Array in Ascending or Descending order?"); 
        Console.WriteLine("1-Ascending"); 
        Console.WriteLine("2-Descending"); 
        //Create another switch statement to select either ascending or descending sort. 
        int userDecision3 = Convert.ToInt32(Console.ReadLine()); 
        switch (userDecision3) 
        { 
         case 1: 
         QuickSort(Years); 
         Console.WriteLine("Contents of the Ascending Month array: "); 
         foreach (var month in Months) 
         { 
          Console.WriteLine(month); 
         } 
         break; 
         case 2: 
         //Same problem, how do I sort it in descending order? 
          Console.WriteLine("Contents of the Descending month array: "); 
         foreach (var month in Months) 
         { 
          Console.WriteLine(); 
         } 
         break; 
        } 
        break; 


     } 

    } 
    public static void QuickSort<T>(T[] data) where T : IComparable<T> 
    { 
     Quick_Sort(data, 0, data.Length - 1); 
    } 

    public static void Quick_Sort<T>(T[] data, int left, int right) where T : IComparable<T> 
    { 
     int i, j; 
     T pivot, temp; 
     i = left; 
     j = right; 
     pivot = data[(left + right)/2]; 
     do 
     { 
      while ((data[i].CompareTo(pivot) < 0) && (i < right)) i++; 
      while ((pivot.CompareTo(data[j]) < 0) && (j > left)) j--; 
      if (i <= j) 
      { 
       temp = data[i]; 
       data[i] = data[j]; 
       data[j] = temp; 
       i++; 
       j--; 
      } 
     } while (i <= j); 
     if (left < j) Quick_Sort(data, left, j); 
     if (i < right) Quick_Sort(data, i, right); 
    } 
比較の結果を変更することができます
+0

また、ソート順を決定するパラメタを渡すこともできます。 Linqでは、マイクロソフトの開発者が独自のメソッドOrderByDescending()を作成することに決めました。 – fubo

+0

組み込みのソート方法は使用できません – Ulfren

答えて

2

をあなたのクイックソート方法を変更することができます使用し、それを使って比較を行います。

デフォルトの比較順序を使用する場合はComparer<T>.Defaultを使用するか、Comparer<T>.Create()を使用してカスタム(逆の)比較を作成できます。

コンパイル可能例:

  1. タイプTIComparable<T>を実装する必要はありません:

    using System; 
    using System.Collections.Generic; 
    
    namespace ConsoleApp1 
    { 
        class Program 
        { 
         static void Main() 
         { 
          int[] data = {6, 7, 2, 3, 8, 1, 9, 0, 5, 4}; 
    
          QuickSort(data); 
    
          Console.WriteLine(string.Join(", ", data)); // Prints 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 
    
          QuickSort(data, Comparer<int>.Create((a, b) => b.CompareTo(a))); 
    
          Console.WriteLine(string.Join(", ", data)); // Prints 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 
         } 
    
         public static void QuickSort<T>(T[] data) 
         { 
          Quick_Sort(data, 0, data.Length - 1, Comparer<T>.Default); 
         } 
    
         public static void QuickSort<T>(T[] data, IComparer<T> comparer) 
         { 
          Quick_Sort(data, 0, data.Length - 1, comparer); 
         } 
    
         public static void Quick_Sort<T>(T[] data, int left, int right, IComparer<T> comparer) 
         { 
          int i, j; 
          T pivot, temp; 
          i = left; 
          j = right; 
          pivot = data[(left + right)/2]; 
          do 
          { 
           while ((comparer.Compare(data[i], pivot) < 0) && (i < right)) i++; 
           while ((comparer.Compare(pivot, data[j]) < 0) && (j > left)) j--; 
           if (i <= j) 
           { 
            temp = data[i]; 
            data[i] = data[j]; 
            data[j] = temp; 
            i++; 
            j--; 
           } 
          } while (i <= j); 
          if (left < j) Quick_Sort(data, left, j, comparer); 
          if (i < right) Quick_Sort(data, i, right, comparer); 
         } 
        } 
    } 
    

    これは、2つの利点があります。比較を行うオブジェクトIComparer<T>を渡すことができます。

  2. 異なるカスタムのIComparer<T>オブジェクトを渡すことによって、複数の方法で同じデータを並べ替えることができます。

これは、例えばEnumerable.OrderBy()

+0

ソリューションをありがとうございます。私はプログラミングに慣れていないし、まだインターフェイスについて学んでいない。私がここに示した特定のソリューションをよりよく理解するためには、何を調べるべきですか?また、このソリューションでは、組み込みのソート機能と検索機能を使用します。これは、自分のタスクでこれを使用することが許可されていないためです。 – Ulfren

+0

@IllimarIssak組み込みソートや検索を使用していません。それは単に要素を比較する方法を指定するインターフェイスを使用しているだけです。詳細については、['IComparer '](https://msdn.microsoft.com/en-us/library/8ehhxeaf(v = vs.110).aspx)を参照してください。 –

0

追加パラメータが

(data[i].CompareTo(pivot) < 0) 
and 
(pivot.CompareTo(data[j]) < 0) 

一つの簡単な方法:引数descending +1/-1IComparer<T> comparerを受け入れるように

data[i].CompareTo(pivot) * descending < 0 
0

ちょうど@Matthewワトソン解答上のクリームのビットを追加して、LINQのIEnumerableを拡張の数で採用されたアプローチです。 @Illimarの投稿を読んだ後、彼は昇順モードまたは降順モードのいずれかで配列をソートする選択肢をユーザに与えたいと思っていました。私は、次を思い付く@Matthew作品を編集した:

ユーザー上記の入力としてソートする番号が与えられ、その後、ソートが行われるべきかを選択したそうで
using System; 
    using System.Collections.Generic; 
    using System.Threading; 

    namespace Test1 
    { 

      class Program 
    { 
    static void Main(string[] args) 
    { 
     MySorter(); 
    } 

    static void MySorter() 

    { 
     int[] data = MyArray(); 
     Console.WriteLine(); 
     Console.WriteLine("Chose 1 to sort Ascending or 2 to sort Descending:"); 
     //int choice = Console.Read(); 
     ConsoleKeyInfo choice = Console.ReadKey(); 
     Console.WriteLine(); 
     if (choice.Key == ConsoleKey.D1 || choice.Key == ConsoleKey.NumPad1) 
     { 
      QuickSort(data); 
      string result = string.Join(", ", data); 
      Console.WriteLine(result); 
      Thread.Sleep(4000); 
     } 
     else if (choice.Key == ConsoleKey.D2 || choice.Key == ConsoleKey.NumPad2) 
     { 
      QuickSort(data, Comparer<int>.Create((a, b) => b.CompareTo(a))); 
      Console.WriteLine(string.Join(", ", data)); 
      Thread.Sleep(4000); 
     } 
     else 
     { 
      Console.WriteLine("wrong input."); 
      Thread.Sleep(2000); 
      Environment.Exit(0); 
     } 
    } 

    public static int[] MyArray() 
    { 
     Console.WriteLine("Enter a total of 10 numbers to be sorted: "); 
     int[] InputData = new int[10]; 
     for (int i = 0; i < InputData.Length; i++) 
     { 
      var pressedkey = Console.ReadKey(); 
      int number; 
      bool result = int.TryParse(pressedkey.KeyChar.ToString(), out number); 
      if (result) 
      { 
       InputData[i] = number; 
      } 

     } 

     return InputData; 
    } 

    public static void QuickSort<T>(T[] data) 
    { 
     Quick_Sort(data, 0, data.Length - 1, Comparer<T>.Default); 
    } 

    public static void QuickSort<T>(T[] data, IComparer<T> comparer) 
    { 
     Quick_Sort(data, 0, data.Length - 1, comparer); 
    } 

    public static void Quick_Sort<T>(T[] data, int left, int right, IComparer<T> comparer) 
    { 
     int i, j; 
     T pivot, temp; 
     i = left; 
     j = right; 
     pivot = data[(left + right)/2]; 
     do 
     { 
      while ((comparer.Compare(data[i], pivot) < 0) && (i < right)) i++; 
      while ((comparer.Compare(pivot, data[j]) < 0) && (j > left)) j--; 
      if (i <= j) 
      { 
       temp = data[i]; 
       data[i] = data[j]; 
       data[j] = temp; 
       i++; 
       j--; 
      } 
     } while (i <= j); 
     if (left < j) Quick_Sort(data, left, j, comparer); 
     if (i < right) Quick_Sort(data, i, right, comparer); 
    } 

    } 

    } 

関連する問題