2016-10-06 23 views
-6

私は2色と3色の解決策を検討しましたが、4色では解決できません。4色のオランダ国旗

助けてください。

rrbb????yyygggですか? 緑の旗はどうやって交換するのですか?

私は以下の解決策を試しましたが、最後の黄色を緑色に交換することはできません。

public class count123 { 

// Java program to sort an array of 0, 1 and 2,3 

    static void sort0123(int a[], int arr_size) 
    { 
     int lo = 0; 
     int hi = arr_size - 1; 
     int mid = 0,temp=0; 
     int h2=arr_size - 1; 
     while (mid <= hi) 
     { 
      switch (a[mid]) 
      { 
      case 0: 
      { 
       temp = a[lo]; 
       a[lo] = a[mid]; 
       a[mid] = temp; 
       lo++; 
       mid++; 
       break; 
      } 
      case 1: 
       mid++; 
       break; 
      case 2: 
      { 
       temp = a[mid]; 
       a[mid] = a[hi]; 
       a[hi] = temp; 

       hi--; 
       h2=hi; 
       break; 
      } 
      case 3:{ 
       temp = a[mid]; 
       a[mid] = a[h2]; 
       a[h2] = temp; 
      // h2--; 
       //hi=h2; 
       break; 

      } 
      } 
     } 
    } 

    /* Utility function to print array arr[] */ 
    static void printArray(int arr[], int arr_size) 
    { 
     int i; 
     for (i = 0; i < arr_size; i++) 
      System.out.print(arr[i]+" "); 
      System.out.println(""); 
    } 

    /*Driver function to check for above functions*/ 
    public static void main (String[] args) 
    { 
     int arr[] = {0, 1, 0,1,2,2,0,3,3,0,0,1}; 
     int arr_size = arr.length; 
     sort0123(arr, arr_size); 
     System.out.println("Array after seggregation "); 
     printArray(arr, arr_size); 
    } 
} 
/*This code is contributed by Devesh Agrawal*/ 
+0

なぜこのような複雑な方法でそれをしたいですか?任意の整数を扱うことができる適切なソートアルゴリズムを使用するか、本当に4つの値が必要な場合は、最も単純なバケットソートを使用します(リスト内に何個の0,1,2,3があるかをカウントし、それに応じて再作成します)。 –

答えて

2

私はあなたのコードを実行し、あなたのコードは、あなたのプログラムの開発は、何もしないんせ無限ループ、に入ることに気づきました。 mainメソッド、sort0123(arr, arr_size);

が呼び出され、このメソッド内で、while (mid <= hi)、ミッド= 6、HI = 9、それは6 <= 9を意味し、このためresaonであり、この条件があるため、それがに常に行くという事実を無限にtrueを返しますある時点でケース3、ケース3では、midおよびhiの値は変更されない。

コードを実行できるようにするには、midおよび/またはhiの値を論理的に変更する必要があります。これにより、プログラムは動作します。

+0

私は知っていますが、私はこの解決策を得ることができません。 – coder25

+0

@ coder25正直なところ、あなたが求めていることを理解できませんでした。あなたが親切にあなたの質問をより詳細に編集できるなら、私はあなたを助けるかもしれません。 –

+0

@ coder25また、次の質問を見ることもできます。彼の解決策はほぼ完了しています。 http://stackoverflow.com/questions/17706636/dutch-national-flag-not-working-for-larger-array?rq=1また、以下を見てください。 https://en.wikipedia.org/wiki/Dutch_national_flag_problem –

0

オランダのフラグ集合についての点は、不変量が常に維持されている点です。な0000などの状態では... 11..XXX..222

  1. loが常に半ばには、常に最初の未知
  2. になります
  3. 最初の「1」(存在する場合)になります
  4. HIコードからケースのように思えるように注文0,1,3,2にソートされていると仮定し、4色のバリエーションについては、最後の未知

で常にある、ルールはする必要があります。

  1. HIは、上記の規則に続き、最後不明

で常にある、コードは次の方法で変更する必要があります最後の3

  • H2に常にある:

    while (mid <= h2)

    。 。 。

    case 2: 
         { 
          temp = a[mid]; 
          a[mid] = a[hi]; 
          a[hi] = temp; 
    
          hi--; 
          h2--; 
          break; 
         } 
    case 3:{ 
          temp = a[mid]; 
          a[mid] = a[h2]; 
          a[h2] = temp; 
          h2--; 
          break; 
    
         } 
    

    0,1,2,3の順番で並べ替えるには、単に「2」と「3」のケースステートメントを交換します。

    PS:簡単に問題を理解できるように質問を説明してください。

  • 関連する問題