아래의 퀵 정렬 알고리즘을 구현하는 데있어 잘못된 점이 무엇입니까? 디버그는 "액세스 위반 기록 위치"를보고합니다. 나는 그것을 발견 할 수 없다. 피벗의 위치를 sort
및 partition
함수의 인수로 전달해야합니까? 이 코드는 대화 형 온라인 데모 인 http://me.dt.in.th/page/Quicksort을 기반으로합니다.Quicksort 알고리즘 액세스 위반 작성 위치
#include <cstdio>
#include <cstdlib>
#include <cstdint>
#include <utility>
#define LIST_SIZE (UInt)10
typedef uint64_t UInt;
void print(UInt * list, UInt size) {
for (UInt i = 0; i < size; i++)
printf("%llu ", list[i]);
printf("\n");
}
void fill(UInt * list, UInt size) {
for (UInt i = 0; i < size; i++)
list[i] = (UInt)std::rand();
}
UInt partition(UInt * list, UInt left, UInt right) {
UInt p = list[left], t = left + 1;
for (UInt i = left + 1; i <= right; i++) {
if (list[i] < p) {
std::swap(list[i], list[t]);
t++;
}
}
std::swap(p, list[t]);
return t;
}
void sort(UInt * list, UInt left, UInt right) {
UInt p;
if (left < right) {
p = partition(list, left, right);
sort(list, left, p - 1);
sort(list, p + 1, right);
}
}
void quicksort(UInt * list, UInt size) {
sort(list, 0, size - 1);
}
int main(int argc, char ** argv) {
UInt list[LIST_SIZE];
fill(list, LIST_SIZE);
print(list, LIST_SIZE);
quicksort(list, LIST_SIZE);
print(list, LIST_SIZE);
return 0;
}
일부 디버그 인쇄물을 얻고 각 단계가 자신이 생각하는대로하고 있는지 확인하십시오. –
확실히이 코드를 디버거를 통해 실행하고 한 단계 씩 실행하여 생각했던대로 작동하는지 확인하십시오. 'partition()'의 반환 값에 특히주의하십시오. 또 다른 유용한 기술은 파티션 값이'left'와'right' 사이 인 경우와 같이 프로그램을 중단시키는 가정을'assert()'하는 것입니다. – Davislor
디버거를 사용하여 프로그램을 살펴본 결과 깨진 것으로 보입니다. segfault는 스택 추적에서 매우 깊게 발생합니다 (재귀 깊이 ~ 400). – OutOfBound