2012-04-19 5 views
1

나는 작업중인 프로그램에서 다양한 유형의 정렬을 구현하려고 시도해 왔습니다. 지금까지 나는 정수를 정렬 할 수있었습니다.이 (병합) 코드가 int 배열이 아닌 String 배열을 정렬하도록 변경해야하는 것은 무엇입니까? 시간 복잡도는 다양합니까? 그렇다면, 좋든 나쁘 든?문자열 병합 정렬 구현

EDIT 1 : compareTo를 사용하려고했습니다. 뭔가 옳지 않은 것처럼 보입니다. 오류가 반환됩니다 (예 : ). 문자열을 int로 변환 할 수없고 그 반대로도 변환 할 수 없습니다. 수정 됨

EDIT 2 : if (array [low] .compareTo (array [high])> = 0) 행에서 NullPointerException이 발생합니다. 제안은 언제나 환영합니다.

오류입니다 :

null null null null null 
Exception in thread "main" java.lang.NullPointerException 
    at Merge.mergeSort_srt(Merge.java:28) 
    at Merge.Sort(Merge.java:15) 
    at Sort.main(Sort.java:73) 

import java.io.File; 


public class Merge 
{ 
    public void Sort (LinkedList listIn, int size) throws Exception 
    { 
     String[] mergeArray = new String[size] ; 
     String textContent = null ; 
     File outputFile ; 

     for(int i = 0; i < mergeArray.length; i++) 
      System.out.print(mergeArray[i]+" "); 
      System.out.println(); 
      mergeSort_srt(mergeArray,0, mergeArray.length-1); 
      System.out.print("Values after the sort:\n"); 
      for(int i = 0; i <mergeArray.length; i++) 
      System.out.print(mergeArray[i]+" "); 
      System.out.println(); 
      System.out.println("PAUSE"); 
    } 


    public static void mergeSort_srt(String array[],int lo, int n) 
    { 
      int low = lo; 
      int high = n; 
      if (array[low].compareToIgnoreCase(array[high]) >= 0) 
      { 
       return; 
      } 

      int middle = ((n+1)/ 2); 
      mergeSort_srt(array, low, middle); 
      mergeSort_srt(array, middle + 1, high); 
      int end_low = middle; 
      int start_high = middle + 1; 
      while ((array[low].compareToIgnoreCase(array[end_low]) <= 0) && (array[start_high].compareToIgnoreCase(array[high]) <= 0)) 
      { 
       if(array[low].compareToIgnoreCase(array[start_high]) < 0) 
       { 
        low++; 
       } 
       else 
       { 
        String Temp = array[start_high]; 
      for (int k = start_high- 1; k >= low; k--) 
      { 
       array[k+1] = array[k]; 
      } 
      array[low] = Temp; 
      low++; 
      end_low++; 
      start_high++; 
      } 
      } 
    } 

} 
+0

돈을 게시물을 편집하면 제목에 EDIT라는 단어를 넣지 마십시오. 스택 오버플로에서 예외가 아니라 편집이 표준입니다. – teukkam

+0

그것에 대해 죄송합니다 – serge

답변

6

그것은 당신이 당신의 문자열을 정렬 할 방법에 따라 다르지만 방법은 StringcompareTo 당신이 정렬의 종류 달성 할 것 :

Returns: the value 0 if the argument string is equal to this string; a value less than 0 if this string is lexicographically less than the string argument; and a value greater than 0 if this string is lexicographically greater than the string argument.

+0

대신에 (배열 [낮은] <배열 [start_high]) 내가 배열 [낮은] .toCompareTo (배열 [start_high])해야합니까? 정렬 방식은 오름차순 – serge

+1

@ voth1234'if (array [low] .compareTo (array [start_high]) <0)'는'array [low]'가 * 열등하다는 것을 의미합니다. array [start_high ]' – talnicolas

+0

나는 본다. 나는 그것을하려고 노력할 것이다. 그리고 내가 가지고 있으면 나는 다시 게시 할 것이다. 감사합니다. – serge