2010-06-02 5 views
2

퀵소트를 구현해야합니다. Programming Pearls에서 코드는 다음과 같습니다.퀵 정렬 구현시 버그

public class Quick{ 
    public static void quicksort(int x[], int l, int u) 
    { 
     if (l>=u) 
      return; 
     int t = x[l]; 
     int i = l; 
     int j = u; 

     do 
     { 
      i++; 
     } while (i<=u && x[i]<t); 

     do 
     { 
      j--; 
      if (i>=j) break; 
     } while (x[j]>t); 

     swap(x, i, j); 
     swap(x, l, j); 

     quicksort(x, l , j-1); 
     quicksort(x, j+1, u ); 
    } 

    public static void main(String[]args) 
    { 
     int x[] = new int[]{55,41,59,26,53,58,97,93}; 
     quicksort(x, 0, x.length-1); 
     for (int i=0; i<x.length; i++) 
     { 
      System.out.println(x[i]); 
     } 
    } 

    public static void swap(int x[], int i, int j) 
    { 
     int s = x[i]; 
     x[i] = x[j]; 
     x[j] = s; 
    } 
} 

작동하지 않습니다. 결과는 다음과 같습니다.

59 
41 
55 
26 
53 
97 
58 
93 

왜 작동하지 않습니까?

+1

그래, 그것은 ... 아주 잘 분류되어 보이지 않는 :) 즐길 확신 – VoodooChild

+0

올바르게 코드 포맷을 시도 - 그것은 훨씬 쉽게 읽을 수 및 디버그합니다 –

답변

3

은 다음과 같아야합니다

int t=x[l]; 
int i=l; 
-> int j=u + 1; 

는 또한, 당신은 잘못 사이비 코드를 번역했다 : 여기가 C#으로있다가 (C와 매우 비슷한 그냥 배열 선언을 변경) :

public static class Sort 
{ 
    public static void quicksort(int[] x, int l, int u) 
    { 
     if (l >= u) 
      return; 

     int t = x[l]; 
     int i = l; 
     int j = u + 1; 

     while (true) // In C, make this while(1) 
     { 
      do 
      { 
       i++; 
      } while (i <= u && x[i] < t); 

      do 
      { 
       j--; 
      } while (x[j] > t); 

      if (i >= j) 
       break; 

      swap(x, i, j); 
     } 

     swap(x, l, j); 

     quicksort(x, l, j - 1); 
     quicksort(x, j + 1, u); 
    } 


    public static void swap(int[] x, int i, int j) 
    { 
     int s = x[i]; 
     x[i] = x[j]; 
     x[j] = s; 
    } 
이와

콜링 :

static void Main(string[] args) 
    { 
     int[] x = new int[] { 55, 41, 59, 26, 53, 58, 97, 93 }; 

     Sort.quicksort(x, 0, x.Length - 1); 
     for (int i = 0; i < x.Length; i++) 
     { 
      Console.WriteLine(x[i]); 
     } 
    } 

는 생산 :

26 
41 
53 
55 
58 
59 
93 
97 
+3

와아! 그 모든 코드를 읽는 +1! –

+0

젠장, 너는이 쉬 * t를 이렇게 쉽게 발견 할 수있는 비밀을 나눠야 해. 대답 할 때 – VoodooChild

+0

이 작동하지 않는다. 내가 바꿨지 만 –

0

이렇게 대답 한 것 같습니다.

알고리즘 태그에 있기 때문에 내가 진행하고있는 정렬을 보여주는 this neat website을 보았습니다.

것은 이것 좀 봐, 나는 당신이