2009-08-16 10 views
0

을 이해하려고 노력 나는 다음과 같은 코드에 대한 세 가지 질문이 있습니다는 버킷 정렬 코드를

static void funct(int[] list) { 
    final int N = 20; 

    java.util.ArrayList[] buckets = new java.util.ArrayList[N]; 
    for(int i = 0; i< list.length; i++) { 
    int key = list[i]; 
    if(buckets[key] = null) 
      buckets[key].add(list[i]); 
    } 
    int k = 0 
    for(int i = 0; i <buckets.length; i++) { 
     if(buckets[i] != null) { 
      for(int j = 0; j< buckets[i].size(); j++) 
       list[k++] = (Integer)buckets[i].get(j); 
     } 
    } 

} 그것은 단지 최대 작동됩니다

  1. 알고리즘은 주요 단점을 갖고 20 요소가 있으며 복잡도가 낮습니까?

  2. 코드의 요점은 요소 목록을 정렬하는 것입니다. 배열의 요소를 배열에 넣은 다음 버킷에 넣은 다음 버킷에서 다시 배열에 넣습니다.

  3. Heres 내가 어떻게 저주 받았는지, 정수 대신 다른 클래스의 객체를 포함하는 배열을 전달할 수 있도록 메소드를 수정하는 방법은 무엇입니까?

답변

2

주소 질문 : 두 가지 단점입니다

  1. . 잠시 복잡성에 신경 쓰지 마십시오. 20 가지 이상의 요소에서 어떻게 작동하는지 생각해보십시오. 버킷 정렬의 경우, 요소의 전체 범위에서 요소의 위치를 ​​기반으로 버킷을 선택하는 것이 좋습니다. 바이너리 기반 정수를 사용하는 컴퓨터에서 가장 쉬운 방법은 숫자에서 처음 몇 비트 (최상위 비트)를 선택하고 16 또는 32와 같이 2의 거듭 제곱 수를 사용하는 것입니다. and 연산 (&)으로 최상위 비트를 얻고 (따라서 버켓을 계산하십시오). 그런 다음 비트를 사용하여 버킷을 직접 선택할 수 있습니다.

  2. 버킷 정렬의 개념은 입력에 대한 초기 패스에 기수 정렬 요소를 사용하고 작은 버킷에 다른 정렬 (또는 반복 기수 정렬)을 사용하는 것입니다. 쉽게 정렬되거나 배열과 같은 모든 버킷의 연결이 덜 복잡한 방식으로 정렬 될 수 있습니다.

  3. 버킷 정렬은 전체 입력 범위를 기반으로하므로 해당 범위를 세그먼트로 나눈 다음 개별적으로 입력을 분류 할 수 있습니다. 가장 쉬운 방법은 입력이 숫자 인 경우입니다. 입력의 순서가 상대적이며 알려진 절대 값이없고 전체 범위에서 요소 하나가 어디인지 쉽게 파악할 수있는 방법이 없다면 버킷 정렬은 적합하지 않습니다.

0

좋은 숙제입니다. 많은 질문들이 주관적이며 거의 틀림없이 당신의 수업에 달려 있습니다.

수업 레슨이 강사가 찾고있는 것이 무엇인지에 대한 더 나은 아이디어를 줄 것입니다.

게다가 교실 밖에서 아무도 이걸 보지 않았다면 대답은 기본 제공 배열 정렬을 사용하고이 쓰레기를 버리는 것입니다!