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;
}
스왑을 다음과 같이 선언했습니다.
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] 삭제
몇 마디 만하겠습니다