QuickSort가 작동하지 않습니다. 스왑이 문제라고 생각합니다. 면책 조항 제공된 quicksort 방법을 사용해야합니다.

ngzg611
try {
            for (i = 0; i < data.length; i++) {
                working[i] = data[i];
            }

            FileWriter fw3 = new FileWriter("quicksort.dat");

            long startTime3 = System.nanoTime();

            quickSort(working,0, working.length - 1);

            long endTime3 = System.nanoTime();

            long totalTime3 = endTime3 - startTime3;

            System.out.println("The time to complete the quick sort was :" + totalTime3 + " nano seconds");

            for (i = 0; i < working.length; i++) {
                fw3.write(Integer.toString(working[i]) + "\n");
            }
            System.out.println("The file has been sorted by quick sort and output to quicksort.dat \n");

            fw3.close();
        } catch (IOException e) {
            System.out.println(e);
        }




static void quickSort(int data[], int left, int right) {

        int i, j;
        int partition;
        if (right > left) {
            partition = data[right];
            i = left - 1;
            j = right;

            for (;;) {
                while (data[++i] < partition);
                while (data[--j] > partition);
                if (i >= j) {
                    break;
                }
                swap(data[i], data[j]);
                swap(data[i], data[right]);
                quickSort(data, left, i - 1);
                quickSort(data, i + 1, right);

            }
        }
    }

    static void swap(int left, int right) {
        int array[] = new int[19];
        int temp = array[left];
        array[left] = array[right];
        array[right]=temp;

이것은 전체 프로그램이 다른 종류의 코드의 일부입니다. 퀵 정렬 기능에 도달 할 때마다 경계 초과 오류가 발생합니다. 나는 파일이 얼마나 큰지 19를 내 배열로 사용합니다.

편집 : 나는 여전히 범위를 벗어난 오류가 발생하는 변경 사항을 반영하기 위해 아래에 업데이트 된 코드를 제공했습니다.

    static void quickSort(int data[], int left, int right) {

    int i, j;
    int partition;
    if (right > left) {
        partition = data[right];
        i = left - 1;
        j = right;

        for (;;) {
            while (data[++i] < partition);
            while (data[--j] > partition);
            if (i >= j) {
                break;
            }
            swap(data, i, j);
            swap(data, i, right);
            quickSort(data, left, i - 1);
            quickSort(data, i + 1, right);

        }
    }
}


static void swap(int array[], int left, int right) {
     int temp = array[left];        
     array[left] = array[right];    
     array[right] = temp;          

}
Racraman

스왑을 다음과 같이 선언했습니다.

void swap(int left, int right)

따라서 인수는 배열의 인덱스입니다.

그러나 다음과 같이 호출합니다.

swap(data[i], data[j]);

따라서 배열의 값을 전달합니다.

호출을 다음으로 변경해보십시오.

swap(i, j);

추가하려면 수정 :

위의 문제는 제시된 정렬 알고리즘의 문제 중 하나 일 뿐이라는 점을 지적해야합니다. 또 다른 문제는 swap알고리즘이 실제로 아무것도 바꾸지 않는다는 것입니다. 지역 배열 변수를 생성하고 array그에 대해 작동 한 다음 반환합니다 (따라서 해당 지역 변수 삭제).

만약 당신의 할당이 정렬 된 숫자 목록을 출력하는 것이고 제시된 정렬 코드를 사용하여 숫자를 정렬해야하는 경우-제시된 정렬 코드가 정렬 알고리즘으로서 절망적으로 결함이 있기 때문에 할당이 불가능합니다. 그것은 (당신이 스스로 찾은 것처럼) 정렬하지 않으며 Quicksort의 올바른 구현에 비해 노골적인 심각한 문제가 있습니다 (예 : https://stackoverflow.com/a/63811974/681444 )

다음 수정 된 코드를 추가하려면 수정 :

수정 된 분류 코드는 여전히 절망적으로 파열됩니다. QuickSort의 올바른 구현이 아니며 여전히 올바르게 정렬되지 않습니다.

예를 들어, 최종 요소가 가장 큰 상태에서 실행 해 보았습니다.

int data[] = {23, 8, 19, 35, 2, 12, 7, 64 };

결과 : 정렬 없음-이 방법은 if (i >= j) {break;}i == 7 및 j == 6으로 똑바로 으므로 아무 작업도 수행하지 않았습니다.

반면에, 대답의 방법은 당신이 방법을 비교할 수 있도록 해당에 대해 부여 된, 제대로 분류 이상에 연결 - 다른 설립 된 기사에 대해 (예를 들어,에 대한 인터넷 검색을 수행 java quicksort, 많은 약이있다)

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관