2017-09-06 4 views
1

먼저 배열 이외의 다른 것을 사용할 수있는 정렬 방법을 더 잘 알고 있다고 말해 보겠습니다. 사용자가 배열에 문자열을 저장하고, 삭제하고, 표시하고, 정렬 할 수있는 클래스에 대한 할당입니다. 나는 여기에서 어디로 가야 할 지 완전히 잃어버린다. 버블 정렬을 사용하려고 노력하고 있는데, 배열의 첫 번째 항목이 무엇이든간에 정렬되지 않습니다. null 값을 필터링하여 null 포인터 예외를 피할 수 있는데, 이는 if 문이 너무 길기 때문입니다.Java- compareTo() 메서드를 사용하여 문자열 배열을 수동으로 정렬

private void sortItems(String[] cargohold) { 
    String temp; 
    for (int i = 0; i < cargohold.length - 1; i++) { 
     for (int j = 1; j < cargohold.length; j++) { 
      if (cargohold[i] != null && cargohold[j] != null && (cargohold[i].compareTo(cargohold[j]) < 0)) { 
       temp = cargohold[j]; 
       cargohold[j] = cargohold[i]; 
       cargohold[i] = temp; 
      } 
     } 
    } 
} 

나는이 작업을 여러 가지 방법으로 시도해 봤지만 제대로 작동하지 않아야하는 이유를 찾을 수 없습니다. 예를 들어 스택 오버 플로우에서 찾을 수있는 모든 것을 훑어 보았고 아무도 같은 문제를 겪지 않았습니다.

요약하면 "Derp", "Herp", "Sam", "Alfred", "Bill"등 5 개의 문자열이있을 수 있습니다.이 종류는 "Derp", "Alfred", "Bill" , "Herp", "Sam". 안내에 미리 감사드립니다.

+1

우선 거품 형이 아닙니다. 첫 번째 문제는 – WIR3D

+0

@ WIR3D입니다. 이유가 무엇인지 설명해야합니다. 버블 정렬의 내부 루프는 일반적으로 'i + 1'이 아니라 'i + 1'에서 시작합니다. 옆으로 : 변수 뒤에 ('string cargohold []'대신에'String [] cargohold)가 아닌) 타입 뒤에 배열 브래킷을 넣으십시오. – Turing85

답변

3

라인

if(cargohold[i] != null && cargohold[j] != null && (cargohold[i].compareTo(cargohold[j]) < 0)) 

if(cargohold[j] != null && cargohold[j-1] != null && (cargohold[j].compareTo(cargohold[j-1]) < 0)) 

해야하며 스와핑으로 수행해야합니다 :

temp = cargohold[j]; 
cargohold[j] = cargohold[j-1]; 
cargohold[j-1] = temp; 

당신이 어디에, 인접한 요소 비교 거품 정렬의 기억 귀하의 코드는 그렇게하지 않습니다.

결함

i > ji < j하지만, 스와핑 논리는 동일하게 유지하고, 그 완전히 잘못된 경우 경우가있을 것입니다.

+1

또한 정렬이 완료되었을 때 요소가 변경되었는지 여부를 추적해야합니다. – WIR3D

+0

@ WIR3D, 이는 수행 할 수있는 개별 최적화 중 하나이지만 여기에 요점은 아닙니다. –

+0

@SumeetSingh이 코드가 내 코드와 왜 똑같이 작동하는지 설명해 주시겠습니까? – user8570492

0

구현이 잘못되었습니다. 여기

는 (자바 등 속기) 거품 정렬이다

for (index1 = 0; index1 < array.length - 1; ++index1) 
    for (index2 = index1 + 1; index2 < array.length; ++index2) 
     if (array[index1] < array[index1]) 
      swap(array[index1], array[index2]); 

참고 index2 = index1의 내부 루프 + 1. 일부 최적화와

0

거품 정렬 알고리즘 : O(n)의 최상의 경우와 O(n^2)되는

private static void sortItems(String cargohold[]) { 
    String temp; 
    boolean wasSwap = true; 
    for (int index1 = 0; index1 < cargohold.length - 1 && wasSwap; ++index1) { 
     wasSwap = false; 
     for (int index2 = 0; index2 < cargohold.length - index1 - 1; ++index2) { 
      if (cargohold[index2].compareToIgnoreCase(cargohold[index2+1]) > 0) { 
       temp = cargohold[index2]; 
       cargohold[index2] = cargohold[index2+1]; 
       cargohold[index2+1] = temp; 
       wasSwap = true; 
      } 
     } 
    } 
} 

평균 복잡성.