2012-12-12 6 views
2

ArrayList를 정렬하여 가장 작은 것부터 가장 큰 것까지 정렬하려고합니다. 다음 코드를 가지고 있습니다 :ArrayList <BigInteger> 정렬 알고리즘 Java

public static ArrayList<BigInteger> sortBigInteger(ArrayList<BigInteger> toSort){ 
    ArrayList<BigInteger> toReturn = new ArrayList<BigInteger>(); 
    toReturn.add(toSort.remove(0)); 
    for (int i = 0; i < toSort.size(); i++){ 
     BigInteger n = toSort.get(i); 
     boolean eval = false; 
     in: for (int a = 0; a < toReturn.size(); a++){ 
      if (n.compareTo(toReturn.get(a)) < 0){ 
       toReturn.add(a, toSort.remove(i)); 
       eval = true; 
       break in; 
      } 
     } 
     if (!eval) toReturn.add(toSort.remove(i)); 
    } 
    toSort = toReturn; 
    return toReturn; 
} 

그러나 요소가 손실됩니다. 크기가 32 인 ArrayList를 사용하면 크기가 15 인 ArrayList를 얻을 수 있습니다.
주 질문 : 어떻게 ArrayList를 정렬합니까?

+7

'Collections.sort()'를 사용하지 않는 이유가 있습니까? 자기 개선 운동입니까? – amit

+0

@amit Collections.Sort()가 있습니까? 나는 몰랐다. 고마워,하지만 어쨌든 여분의 장소는 어디에서 제거됩니까? – Justin

+0

FAQ (자주 묻는 질문) - http://stackoverflow.com/faq#close> too localized – djechlin

답변

8

항상 Collections.sort(toSort) 을 사용할 수 있습니다.

단순히 ArrayList toSort을 정렬합니다.


참고 - 휠을 다시 발명하는 대신 내장 된 라이브러리를 사용하는 것이 좋습니다.이 라이브러리는 이미 테스트되고 최적화되어 있습니다.

  • 보다 효율적인
  • 더 정확한 (당신이 놓친 것 성가신 가장자리의 경우 이미 알아서는) 빠른
  • 더 나은는
을 유지하고 개발하는 대부분의 경우에 그 결과로 보인다

ps
알고리즘이 실패하는 이유는 toSort에서 요소를 계속 제거한 다음 더 큰 색인에서 읽는 것입니다.

예를 들어, [5,2,9] 목록을 살펴보십시오.
먼저 당신이 i == 0toSort = [5,2,9] , toReturn = []
, 당신은 기본적으로 호출합니다 있습니다 toReturn.add(toSort.remove(0));
그것은리스트가 발생합니다 : toSort = [2,9], toReturn = [5].

그러나 다음 반복에서 - i==1, 그리고 당신은 2가 아닌 9 인 인덱스 1로 요소를 검사 할 것입니다! 당신은 요소를 놓쳤습니다!

(이 실제로는 일종의 내장 사용하는 이유는 좋은 예입니다 것이 더 좋습니다!)


(1) 자기 개선으로 그 일을 당신은 단지 그것을 정렬 할 귀하의 의견에서 가정, 그리고 또는 작업. 알고리즘 정렬에 관심이 있다면 wikipedia page on sorting algorithms이 유용 할 수 있습니다. 특히 자바에서 실제로 사용되는 알고리즘은 TimSort입니다.