2013-08-03 13 views
-1

У меня вопрос о алгоритме сортировки по методу radix. Я нашел эту реализацию:RadixSort Algorithm

import java.lang.*; 
import java.util.LinkedList; 
import java.util.Queue; 
import java.io.*; 

public class RadixSort { 

    public static void radixSort(int[] data) { 
     int z = 0 ; 
     boolean flag = true; 
     int divisor = 1; 
     Queue[] buckets = new Queue[10]; 
     for (int i = 0; i < 10; i++) 
      buckets[i] = new LinkedList(); 

     while (flag) { 
      flag = false; 
      // first copy the values into buckets 
      for (int i = 0; i < data.length; i++) { 
       int hashIndex = (data[i]/divisor) % 10; 
       if (hashIndex > 0) 
        flag = true; 
       ((LinkedList) buckets[hashIndex]).addLast(new Integer(data[i])); 
      } 
      // then copy the values back into vector 
      divisor *= 10; 
      int i = 0; 

      for (int j = 0; j < 10; j++) { 
       while (!buckets[j].isEmpty()) { 
        Integer ival = (Integer) ((LinkedList) buckets[j]) 
          .getFirst(); 
        ((LinkedList) buckets[j]).removeFirst(); 
        data[i++] = ival.intValue(); 
       } 
      } 
      z=z+1 ; 

      System.out.print("Durchlauf " + z + " : "); 
      for (int m = 0; m < data.length; m++){ 

       System.out.print(data[m] + " "); 


      } 
      System.out.println(); 
     } 
    } 

    public static void main(String[] args) { 
     int i; 
     int[] arr = new int[15]; 
     System.out.print("original: "); 
     for (i = 0; i < arr.length; i++) { 
      arr[i] = (int) (Math.random() * 1024); 
      System.out.print(arr[i] + " "); 

     } 
     System.out.println(); 
     System.out.println(); 
     radixSort(arr); 


    } 
} 

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

+0

Это действительно * ваш * код или просто скопирован/вставлен откуда-то и пытается понять? –

+0

просто пытается понять, где цикл будет остановлен. –

+0

Если вы хотите понять, как это работает, тогда один из вариантов - пройти через него в отладчике. –

ответ

1

Я не уверен, какие объяснения вы ищете, но я надеюсь, что это помогает:

Внешние while проходит цикл в то время как flag верно. flag будет ложным после первого запуска, если hashIndex > 0 не реже одного раза, когда вы назначаете значения в ведра в первом цикле for.

Затем у вас есть еще for (int j = 0; j < 10; j++), который будет работать 10 раз за каждое значение j. Вложенный цикл while while (!buckets[j].isEmpty()) будет выполняться столько раз, сколько потребуется, для каждого значения j.

+0

спасибо, это именно то, что я хотел знать –