2014-07-25 2 views
0

1에서 100 사이의 임의의 숫자로 구성된 ArrayList에서 기수 정렬을 구현하려고합니다. 나는 거의 다 왔어, 나는 단지 수십의 장소 정렬을 알아낼 수 없다. 또한, 나는 실제로 버킷에있는 것을 테스트하기 위해 println 문을 두었고 거기에 있으면 안되는 버킷에는 이상한 숫자가 있습니다.기수 정렬 Java 구현

import java.util.ArrayList; 
import java.util.Random; 

private static ArrayList<Integer> newArrayList; 
private static ArrayList<Integer>[] bucket = new ArrayList[10]; 


public static ArrayList<Integer> generateArray(int n){ 
newArrayList = new ArrayList<Integer>(n); 
Random rand = new Random(); 
for (int i = 0; i<n; i++){ 
newArrayList.add(rand.nextInt(n + 1)); 
} 


return newArrayList; 
} 

public static void sort(ArrayList<Integer> x){ 
for (int i = 0; i< 10; i++){ 
    bucket[i] = new ArrayList<Integer>(); 
} 

int power = 1; 
for (int j = 0; j < 3; j++){ 

    for (int k = 0; k < x.size(); k++){ 
     bucket[(x.get(k)/power)%10].add(x.get(k)); 
    } 
    x.clear(); 

    for (int l = 0; l<10; l++){ 
     x.addAll(bucket[l]); 
    } 

    power = power*10; 
    } 

System.out.println(bucket[0]); //diagnostics 
System.out.println(bucket[1]); 
System.out.println(bucket[2]); 
System.out.println(bucket[3]); 
System.out.println(bucket[4]); 
System.out.println(bucket[5]); 
System.out.println(bucket[6]); 
System.out.println(bucket[7]); 
System.out.println(bucket[8]); 
System.out.println(bucket[9]); 
} 
public static void main (String[] args) 
    { 
    ArrayList<Integer> new1 = new ArrayList<Integer>(); 
    new1 = generateArray(100); 
    sort(new1); 
    } 



} 

다음은 인쇄 문의 출력입니다.

[70, 90, 100, 100, 90, 70, 30, 20, 100, 100, 3, 3, 5, 6, 6, 6, 6, 7, 7, 8, 70, 90, 90, 70, 30, 20, 3, 3, 5, 6, 6, 6, 6, 7, 7, 8, 61, 51, 81, 81, 61, 31, 71, 31, 41, 41, 11, 11, 11, 21, 71, 11, 71, 11, 11, 11, 11, 12, 13, 14, 15, 15, 16, 19, 19, 32, 42, 92, 42, 22, 22, 32, 52, 12, 82, 42, 20, 21, 22, 22, 26, 27, 28, 29, 29, 53, 3, 63, 3, 63, 13, 73, 83, 33, 83, 30, 31, 31, 32, 32, 33, 34, 36, 36, 39, 64, 84, 14, 64, 34, 54, 64, 41, 41, 42, 42, 42, 45, 46, 49, 49, 5, 15, 15, 55, 45, 65, 95, 51, 52, 53, 54, 55, 56, 59, 6, 86, 36, 56, 26, 6, 6, 16, 6, 46, 36, 76, 66, 61, 61, 63, 63, 64, 64, 64, 65, 66, 67, 68, 69, 69, 97, 87, 67, 7, 87, 27, 77, 7, 97, 70, 70, 71, 71, 71, 73, 76, 77, 78, 79, 8, 78, 98, 98, 28, 68, 81, 81, 82, 83, 83, 84, 86, 87, 87, 19, 49, 19, 49, 99, 79, 59, 69, 29, 39, 69, 29, 90, 90, 92, 95, 97, 97, 98, 98, 99] 

[61, 51, 81, 81, 61, 31, 71, 31, 41, 41, 11, 11, 11, 21, 71, 11, 71, 11, 11, 11, 11, 12, 13, 14, 15, 15, 16, 19, 19, 100, 100, 100, 100] 
[32, 42, 92, 42, 22, 22, 32, 52, 12, 82, 42, 20, 21, 22, 22, 26, 27, 28, 29, 29] 
[53, 3, 63, 3, 63, 13, 73, 83, 33, 83, 30, 31, 31, 32, 32, 33, 34, 36, 36, 39] 
[64, 84, 14, 64, 34, 54, 64, 41, 41, 42, 42, 42, 45, 46, 49, 49] 
[5, 15, 15, 55, 45, 65, 95, 51, 52, 53, 54, 55, 56, 59] 
[6, 86, 36, 56, 26, 6, 6, 16, 6, 46, 36, 76, 66, 61, 61, 63, 63, 64, 64, 64, 65, 66, 67, 68, 69, 69] 
[97, 87, 67, 7, 87, 27, 77, 7, 97, 70, 70, 71, 71, 71, 73, 76, 77, 78, 79] 
[8, 78, 98, 98, 28, 68, 81, 81, 82, 83, 83, 84, 86, 87, 87] 
[19, 49, 19, 49, 99, 79, 59, 69, 29, 39, 69, 29, 90, 90, 92, 95, 97, 97, 98, 98, 99] 

답변

1

당신은 루프 이전 반복에서 다른 값의 각각의 반복은 여전히 ​​

for (int l = 0; l < 10; l++) { 
    x.addAll(bucket[l]); 
    bucket[l].clear(); //<----- 
} 
있을 것 버킷을 삭제해야