문제

그래서 나는 여러 목록의 단어 쌍을 필요해요 그들을 정렬을 내림차순 또는 오름차순으로.이 방법을 사용하고 오른쪽 지금은 삽입 정렬 알고리즘이 있습니다.그리고 이것을 잘 작동을 위한 작은 목록이 있습니다.하지만 시간 정렬하는 큰 목록이 없이 오류가 있습니다.나도 무슨 일이 있었는지 확인하기 위해에 대하여 디버깅을 인쇄하는"교환되었 b" 당신은 그것을 볼 수 있는 작업을 시작과 그것은 속도가 느려고 결국 정지와 같은 컴퓨터 그는 말했다,"너무 많은,나는 포기".나의 질문은 뭔가가 잘못된 내 코드,또는 단순히 사용할 필요가 방법을 사용하는 것이 보다 효과적,그렇다면,하나는 그 어떤 모습일까?

for (int j=0; j < wordpair_list.size()-1; j++){
    for (int i=0; i < wordpair_list.size()-1; i++){
        String wordA_1 = wordpair_list.get(i).getWordA();
        String wordA_2 = wordpair_list.get(i+1).getWordA();

        if (wordA_1.compareToIgnoreCase(wordA_2) < 0){
            WordPair temp = wordpair_list.get(i);
            wordpair_list.set(i,wordpair_list.get(i+1));
            wordpair_list.set(i+1, temp);           
        }
    }
}

는 내림차순으로.모든 나를 위해 오름차순이 스왑'>'에는 경우 문'<'

도움이 되었습니까?

해결책

나는 당신이 거품을 공연하고 있다고 생각합니다.다른 사람들이 지적했듯이, get () 및 set () 작업을 수행하면 링크 된 목록에서 비용이 많이 듭니다.

저는 Java와 함께 Cercant가 아니지만 ListIterators를 사용하여 버블 정렬을 O (n ^ 2)

로 수행 할 수있는 것처럼 보입니다.

ListIterator ListIterator (int index) 목록 반복자를 반환합니다. 이 목록의 요소 (적절한 순서로), 지정된 목록의 위치.indexOutOfBoundsException을 던졌습니다 지정된 인덱스가 범위를 벗어났습니다 (index <0 || index>= size ()).

버블 정렬의 경우 인접 요소를 교환해야하므로 배열과 같은 목록을 반복하고 필요한 경우 스왑을 계속할 수 있습니다.

이미 정렬 된 목록의 섹션을 건너 뛸 수 있습니다.좋은 거품 정렬 알고리즘을 살펴보십시오. http:///en.wikipedia.org/wiki/bubble_sort

다른 팁

삽입 종류가 이미 o (n ^ 2) 알고리즘이 링크 인덱스에 의해 링크 된 목록의 항목에 대한 액세스 (모두 가져 오기 및 설정)가 O (n) 작동이므로 코드를 o (n ^ 3), 즉 매우 느리게 .

기본적으로 두 가지 옵션이 있습니다.

  • 링크 된 목록을 임시 배열에 복사하고 알고리즘을 사용하여 배열을 정렬하십시오 (인덱스별로 o (1), 전체 알고리즘은 O (n ^ 2)에서 머물러있을 것입니다.배열의 새로 정렬 된 링크 된 목록입니다.
  • 인덱싱 된 액세스가 필요하지 않은 다른 알고리즘을 사용하십시오 (예 : 링크 된 목록에서 인접한 두 항목을 스왑 할 수 있으므로 링크 된 목록 구현을 사용해야합니다).여기서 "이전"및 "다음"링크에 직접 액세스 할 수 있습니다.

첫째로 이 모든 것이지 삽입 정렬,이 가까운 거품입니다.두 번째,아무것도 잘못된 코드와 함께,그러나 예상대로 이 정렬 알고리즘은 차입니다.따라서 더 큰 입력이 오래 걸릴 수 있습니다 시간을 마무리(예:200 000 요소 그것은 몇 분 정도 걸릴 수 있음).

편집:당신이 사용하는 목록 복잡성이 더 높은 최대 cubic.로 set 목록에서 일정하지 않습니다.당신이 시도할 수 있습을 구현하는 알고리즘으로 배열을 저장을 이 추가 복잡합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top