배열에서 다른 데이터의 성능 시간을 확인하고 싶습니다. (임의, 이미 정렬, 내림차순으로 정렬). 여기 이미 정렬 된 데이터에서 내 quicksort가 충돌합니다.
void Quicksort(int *T, int Lo, int Hi)
{
if (Lo<Hi){
int x=T[Lo];
int i=Lo, j=Hi;
do
{
while (T[i] < x) ++i;
while (T[j] > x) --j;
if (i<=j)
{
int tmp = T[i];
T[i] = T[j];
T[j] = tmp;
++i; --j;
}
} while(i < j);
if (Lo < j) Quicksort(T, Lo, j);
if (Hi > i) Quicksort(T, i, Hi);
}
}
생성하고 테스트 배열을 작성하는 데 사용되는 기능은 다음과 같습니다
int* createArr(int length){
int* Arr= new int[length];
return Arr;
}
void Random(int *A, int length){
for (int i=0;i<length;i++){
A[i]=rand();
}
}
void Order(int *A, int length){
for (int i=0;i<length;i++){
A[i]=i;
}
}
void Backwards(int *A, int length){
for (int i=0;i<length;i++){
A[i]=length-i;
}
}
그것은 임의의 숫자에 대해 잘 작동을하지만, 내가하려고 할 때 오름차순으로 그것을 채우기 및 종류, 그와 충돌 할 스택 오버플로. 아무도 저에게 왜 그런 일이 일어날 지에 대한 힌트를 줄 수 있습니까?
주문 된 desc 배열은이 알고리즘의 최악의 경우이며 매우 큰 배열에서 실행하고 있으므로 함수가 스택 오버플로를 실행하는 횟수만큼 자주 호출됩니다. 호출 스택의 한계는 무엇인지 OS 및 컴파일러 설명서를 확인하십시오. 이 문제를 해결하려면 재귀를 루프로 대체하는 것이 좋습니다. – AlexanderM
@AlexanderM 정렬 된 desc 배열은 실제로 첫 번째 (또는 마지막) 항목을 피벗으로 선택하는 알고리즘의 최악의 경우입니다. 중심 항목을 선택하면 평균적으로 더 잘 작동합니다. 배열의 중심에서 가장 작거나 큰 항목을 자주 찾지는 않습니다. 세 위치를 프로빙하고 세 위치의 중앙값을 피벗으로 선택하는 것이 더 좋습니다. – CiaPan