2016-10-06 2 views
-6

Я прошел через решение для двух и трех цветов, но я не могу получить его для четырех цветов.Голландский флаг с четырьмя цветами

Пожалуйста, помогите.

Будет ли это 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

Я бегу код и понял, что ваш код входит в бесконечный цикл , который пусть не делает ваша программа ничего не делать.

В главном методе sort0123(arr, arr_size); вызывается и в рамках этого метода, while (mid <= hi), середина = 6 и привет = 9, и это означает 6 <= 9 и из-за этого resaon, это условие возвращает истину бесконечно из-за того, что она идет всегда случай 3 в какой-то момент и в случае 3 значения середины и 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. вот всегда будет на первом «1» (если он существует)
  2. середины всегда будет на первом неизвестном
  3. привет всегда в последний неизвестный

для изменения 4 цвета, при условии, что вы отсортирован в порядке 0,1,3,2, как представляется, в случае с кодом, правила должны быть изменено следующим образом:

  1. привет всегда в последний 3
  2. 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 просто замените операторы case «2» и «3».

PS: Пожалуйста, задайте вопрос описательным, чтобы помочь людям понять проблему с легкостью.

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