C++에서 Quicksort를 구현하도록 과제를 부여했으며 제대로 작동하는 코드를 작성했습니다. 실패에 대한 알고리즘을 테스트 할 때 백만 개의 요소가 포함 된 이진 파일에서 숫자를 정렬 할 때 충돌이 발생했습니다. 각 요소에 100 만 개의 파일이 두 개 있다는 점에 유의하십시오. 그 중 하나는 정렬되지 않은 것이고 다른 하나는 "거의 정렬 된"것이며, 알고리즘은 "거의 정렬 된"파일을 정렬 할 때만 실패하는 것처럼 보입니다. 내 코드는 다음과 같습니다.C++에서 빠른 정렬 구현 (실패에 대한 테스트)
int partition(int arr[], int low, int high)
{
int pivotI = low; //pivot index
int pivot = arr[pivotI];
int temp = arr[low];
arr[low] = pivot;
arr[pivotI] = temp;
int partitionI = low;
low++;
while (low <= high)
{
if (arr[low] >= pivot)
{
if (arr[high] <= pivot)
{
temp = arr[high];
arr[high] = arr[low];
arr[low] = temp;
low++;
}
high--;
}
else if (arr[high] <= pivot)
{
low++;
}
else
{
low++;
high--;
}
}
if (low == high)
{
if (arr[low - 1] < pivot)
{
temp = arr[low];
}
else
{
temp = arr[low - 1];
}
}
else
{
temp = arr[high];
}
arr[high] = arr[partitionI];
arr[partitionI] = temp;
return high;
}
void quickSort(int arr[], int left, int right)
{
if (left < right)
{
int p = partition(arr, left, right);
quickSort(arr, left, p);
quickSort(arr, p + 1, right);
}
}
* "거의 정렬 된"이진 파일을 실행할 때 스택 오버플로 오류가 발생합니다. 왜 이런 일이 일어나는 지 아십니까? 감사합니다
이러한 문제를 해결하는 올바른 도구는 디버거입니다. 스택 오버플로를 묻기 전에 코드를 단계별로 실행해야합니다. 자세한 도움말은 [작은 프로그램 디버깅 방법 (Eric Lippert 작성)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)을 참조하십시오. 문제를 재현하는 [최소, 완료 및 확인 가능] (http://stackoverflow.com/help/mcve) 예제와 함께 해당 질문을 \ [편집]해야합니다. 디버거. –
아마도 너무 깊은 재귀. –