2011-03-17 5 views
0

여기 선택을 사용하는 내 코드입니다. 내가 삽입을 사용해야하고 임시 배열이나 arraylist를 사용하지 마십시오. 삽입 정렬을하는 방법에 대한 도움이 필요합니다.삽입 정렬을 사용하여 객체의 arraylist 정렬

public static void sortStudents(ArrayList<Student> list) 
{//selection sort 
    Student tempStudent; 
    int count1; 
    int count2; 
    int largest; 

    for (count1=0; count1<list.size()-1; count1++) 
    { 
    largest = 0; 
    for (count2=largest+1; count2<list.size()-count1; count2++) 
    { 
    if ((list.get(largest)).compareTo(list.get(count2)) < 0) 
    { 
    largest = count2; 
    } 
    } 
    tempStudent = list.get(list.size()-1-count1); 
    list.set(list.size()-1-count1, list.get(largest)); 
    list.set(largest, tempStudent); 
    } 
} 
} 
+2

나는 한밤중에 숙제 냄새를 좋아합니다. – whirlwin

+0

http://en.wikipedia.org/wiki/Insertion_sort에는 괜찮은 설명과 의사 코드가 있습니다.이 코드는 – Voo

답변

0

선택 정렬 및 삽입 정렬은 목록의 "아직 정렬되지 않은"부분과 "이미 정렬 된"부분을 갖는 것과 매우 유사하게 작동합니다. 처음에는 첫 번째 부분이 전체 목록이고 두 번째 부분은 시작 또는 끝 부분에 빈 목록이 있습니다. "아직 정렬되지 않은"부분을 정렬하는 동안 "이미 정렬 된"부분은 반복 당 하나의 요소만큼 커집니다.

  • 선택 정렬 들어,은 "아직 분류되지"부분의 최소 (또는 최대)의 요소를 검색에 추가 한 후 거기를 제거하고 :

    선택 정렬과 삽입 정렬의 차이는 이것이다 이미 정렬 된 부분의 끝 (또는 시작 부분)까지.

  • 삽입 정렬의 경우 목록의 "아직 정렬되지 않은"부분의 다음 요소를 가져 와서 "이미 정렬 된"부분에 삽입 지점을 찾아서 삽입합니다.

이것은 선택 정렬을 삽입 정렬로 변경하기에 충분합니다.

0

루프 내에서만 변수를 정의하면 루프 밖에서 변수를 정의하지 않습니다. 변수의 수명을 제한하면 코드에 대해 추론하기가 더 쉬워집니다.

public static void sortStudents (ArrayList<Student> list) 
{ 
    int largest; 

    for (int i=0; i < list.size() - 1; i++) 
    { 
    largest = 0; 
    for (int j=largest + 1; j < list.size() - i; j++) 
    { 
     if ((list.get (largest)).compareTo (list.get (j)) < 0) 
     { 
     largest = j; 
     } 
    } 
    Student tempStudent = list.get (list.size() - 1 - i); 
    list.set (list.size() - 1 - i, list.get (largest)); 
    list.set (largest, tempStudent); 
    } 
} 

조금 더 들여 쓰기하면 코드를 읽기 쉽습니다. 이제 구체적인 오류가 무엇입니까? 컴파일되지 않거나 예외가 발생하거나 잘못된 결과가 발생합니까? 0으로 최대로 설정하면

largest = 0; 
    for (int j=largest + 1; j < list.size() - i; j++) 

후 J는 0 + 1 => 1으로 초기화됩니다 여기

은 내부 루프에서 의심스러운 무언가이다. 네가 또 다른 의도를 가졌다 고 생각해. j = i + 1;을 찾으셨습니까?

+0

이상이어야 올바르게 컴파일되고 실행됩니다. 하지만 그것은 선택 정렬입니다. 나는 그것에 대한 삽입 정렬이 필요합니다. 난 이미 삽입에 대한 몇 가지 메모를 읽고 int [] 정렬 할 수 있습니다. 나는 arraylist를하는 방법을 모른다 . – whiskey

+0

그리고 문제는 정확히 어디에 있습니까? 'arr.length' 대신에'arr [i] - arr [j]'대신'list.size()'를 사용합니다. 위에서 사용했던 것처럼 compareTo를 사용합니다. 당신은 또한 교환하는 방법을 알고 있습니다. 그것은 잘 정의되고 재사용이 가능한 작업이기 때문에 별도의 방법으로 테스트해야합니다.이 테스트는 자체 테스트 할 수 있습니다. –

관련 문제