快速排序实现中的分段错误

Segmentation fault in a quicksort implementation

本文关键字:分段 错误 实现 快速排序      更新时间:2023-10-16

我编写了C++代码来实现快速排序。它可以编译,但在运行时崩溃。我使用了代码块。当我使用调试器时,它说:

分区函数定义中的第 (45) 行的"分段错误"q=Partition(r,n);"。

搜索了它并找到了一些答案,但没有一个能解决我在这里的问题。请告诉我为什么这个程序无法运行。

//Program for Quicksort
#include <iostream>
using namespace std;
int Partition(int* p,int n);
void Qsort(int* p,int n);
void Swap(int* a,int* b);
int main()
{
    int n=0;                                              //array size
    cout<<"Enter array sizen";
    cin>>n;
    int a[n];
    cout<<"Now enter the array elementsn";
    for(int i=0;i<n;i++)                                
        cin>>a[i];                                        //read array
    int *p;
    p=a;
    Qsort(p,n);                                           //call Qsort, args:pointer to 
    cout<<"This is the sorted array:n";                  //array, array size
    for(int i=0;i<n;i++)
        cout<<a[i]<<" "<<endl;                            //print sorted array
    return 0;
}
int Partition(int* p,int n)                               //the partition function
{
    int key=*(p+n-1);
    int i=-1,j=0;
    for(j=0;j<n-1;j++)
    {
        if(*(p+j)<=key)
            {
                i++;
                Swap(p+i,p+j);
            }
    }
    *(p+i+1)=key;
    return i+1;
}
void Qsort(int* r,int n)
{
    int q=0;
    q=Partition(r,n);                          //The debugger points here and says 
    Qsort(r,q);                                //there is a segmentation fault
    Qsort(r+q+1,n-q-1);
}
void Swap(int* a,int* b)                       //To exchange two integer variables
{
    int t=0;
    t=*a;
    *a=*b;
    *b=t;
}

billz 的评论确切地告诉你出了什么问题,但让我试着用更简单的话来表达:

您的Qsort一遍又一遍地调用自己,这个循环永远不会停止,直到您的计算机耗尽资源。您忘记包含将在所有操作完成后触发的退货条件。在排序例程的情况下,这通常是在单个元素上调用排序机制时:没有什么可以排序的,所以我们不妨停止。

尝试在程序中包括此条件。