2009-12-06 6 views
0

this was answered 이후 나는 코드를 계속 진행했습니다.버블 정렬 내림차순 또는 내림차순으로 정렬

static String[][] bubbleSort(String customerdata[][], int sortafter, int asc) 
{ 
    String temp []; 
    boolean sort; 

     do{ 
      sortiert = true; 

      for (int i = 0 ; i < customerdata.length - 1; i++){ 
       if(customerdata[i][sortafter].compareTo(customerdata[i+1][sortafter]) < 0){ 
        temp = customerdata[i]; 
        customerdata[i] = customerdata[i+1]; 
        customerdata[i+1] = temp; 

        sort = false; 
       } 
      } 

     }while(!sort); 

    return customerdata; 
} 

을하지만 당신이 볼 수 있듯이,이 함수 내에서 INT 오름차순을 누락 : 이의이 방법을 완벽하게 작동합니다. 내가 원하는 것은 내림차순 또는 오름차순 정렬 된 배열을 반환하는 것입니다 (ascher == 1 (asc) 또는 asc == 0 (desc)에 따라 다름).

나는 내부적으로 이것을 어떻게 구현할 것인가. 내 말은 오름차순 또는 내림차순으로 정렬 할 수 있지만, 일단이 메서드를 호출하면() 및 if() 루프가 불쾌하게 오래 호출됩니다.

나는 내부를 콤팩트하게하고 습기에 의존하여 bubblesort (x, 0,0) 또는 (x, 0,1)을 제공하고 목록은 내림차순 또는 오름차순으로 반환되어야합니다.

+0

가 숙제 태그를 추가하거나, 프로그램을 종료 :

은 그럼 당신은 하나 개의 라인을 변경해야 할 것입니다.기포 종류는 심각하지 않습니다, 학교 실험을 위해서가 아니면 – Bozho

+0

반드시 숙제가 아니며, 그는 스스로 공부할 수 있습니다. 또한 5 개의 태그 만 있습니다. 우리 모두는 거품 떼가 끔찍하다는 것을 알고 있습니다, 어쨌든 뭔가 배우려고 노력합시다! –

+0

문제가 뭐니? 당신이 프로 그램을 타고 났다고 생각하니? –

답변

1

정렬 오름차순은 i의 요소가 i + 1의 요소보다 작음을 의미합니다. 내림차순 정렬은 i에있는 요소가 에있는 요소보다 큼을 의미합니다. 트릭은 요소의 위치를 ​​결정하는 논리를 뒤집는 것입니다. 특히,이 라인 : 당신이 정렬 순서를 반전하려면

if(customerdata[i][sortafter].compareTo(customerdata[i+1][sortafter]) < 0){ 

if(customerdata[i][sortafter].compareTo(customerdata[i+1][sortafter]) > 0){ 

로 변경해야합니다.

+0

그는 조건부로 매개 변수를 코드에 추가 할 수있는 방법을 묻습니다. 그는 이미 정렬을 변경하는 방법을 알고 있습니다. – Toad

+0

그래, 내 질문에 대한 답변입니다. if (asc == 0) 및 do 루프 내부에서 해결할 수 있습니다. 실력 있는? 그렇지 않아. 공장? 지옥 예! –

1

항상 오름차순으로 정렬 할 수 있으며 내림차순이 필요하면 간단히 되돌릴 수 있습니다. 루프 내부에서 "if"테스트를 반복하는 것이 배열의 다른 순회보다 덜 효율적인지 여부에 대한 질문입니다.

나는 배열의 크기가 상대적으로 작다고 가정합니다. 버블 정렬은 비효율적이며 작은 배열을 제외하고는 사용해서는 안됩니다.

+0

그래, 비효율적 인 방법이 얼마나 비효율적인지 알지 못한다. 그럼에도 불구하고 여전히 자바를 배우고 있으며 비효율적이기 때문에 몇 장을 건너 뛰는 습관이 없다. 어쨌든 나는 이것이 어떻게 작동하는지 이해하고 싶다. –

+0

레코드 용으로도 BubbleSort를 사용하더라도 코드가 여기있는 운영 테이블에서 본 "전문"코드보다 끔찍하다고 생각합니다.하지만, 주요 탭을) 쉽게 읽을 수 있도록 2 칸. –

1

이 시도 :

for (int i = 0 ; i < customerdata.length - 1; i++){ 
     if(customerdata[i+asc][sortafter].compareTo(customerdata[i+1-asc][sortafter]) < 0){ 
      temp = customerdata[i]; 
      customerdata[i] = customerdata[i+1]; 
      customerdata[i+1] = temp; 

      sort = false; 
     } 
} 

오름차순 색인에 추가 0 또는 1 (오름차순 또는 내림차순 ...)

에 의해, 당신은 기본적으로 경우 다른 추가없이 if 문을 교환 할 수 있습니다 ; ^)

(주 I 변경이 개 위치가 같습니다 "+ 오름차순"및 "- ASC")는

편집 : 가에 큰 어설 넣어하는 것을 잊지 마세요 ^)

+0

그래, asert는 좋은 생각 일 것이다. 예외 또한 n catch를 시도한다. 사용자가 0 또는 1 이외의 다른 것을 입력해야하는 경우 –

1

그리고 내가 위에서 준 빠른 해킹 대답 대신 "소프트웨어 엔지니어링"유형 대답을 원한다면, 당신은 functor를 넘겨 줄 수 있습니다. (첫 번째 줄은 0 또는 1 이외의 것이 될 수 없습니다. Comparator 클래스 검색) 비교를 통해 궁극적으로 유연한 검색을 할 수 있습니다.

2

간단한 해결책 : asc1 또는 -1 중 하나로 만들 수 있습니까?

if(asc * customerdata[i][sortafter].compareTo(customerdata[i+1][sortafter]) < 0) 
+0

이제 가장 쉬운 방법입니다. 감사합니다. –

관련 문제