如何优化此非递归快速排序以减少堆栈使用量(;c语言&xFF09;

如何优化此非递归快速排序以减少堆栈使用量(;c语言&xFF09;,c,C,这是一个实现快速排序的非递归程序,我使用数组来模拟堆栈的实现,但每次我对数组的一部分进行排序时,占用空间都会呈指数级增加。如何优化此程序以使使用量更小?就像重用以前被丢弃的空间(X被遍历的地方)或者其他什么,我真的很想弄明白,提前谢谢你 #包括 #包括 int堆栈[1000]; 整数部分(整数a[],整数开始,整数结束) { int l=开始; int r=结束; int极点=a[开始]; 而(l调用非递归快速排序(a,0,10)是错误的,因为这会导致在部分中引用[10];正确的是非递归快速排序

这是一个实现快速排序的非递归程序,我使用数组来模拟堆栈的实现,但每次我对数组的一部分进行排序时,占用空间都会呈指数级增加。如何优化此程序以使使用量更小?就像重用以前被丢弃的空间(X被遍历的地方)或者其他什么,我真的很想弄明白,提前谢谢你

#包括
#包括
int堆栈[1000];
整数部分(整数a[],整数开始,整数结束)
{
int l=开始;
int r=结束;
int极点=a[开始];

而(l调用
非递归快速排序(a,0,10)
是错误的,因为这会导致在
部分中引用[10];正确的是
非递归快速排序(a,0,9)

重用先前丢弃的空间(其中X已被遍历)

为此,名为
stack
的FIFO中的索引
x
y
将环绕在数组的末尾。这是
非递归快速排序中循环的修订版本,还带有防止溢出的检查:

    #define DIM sizeof stack / sizeof *stack    // DIM must be even
    while (x != y)
    {
        // Simulate stack popout left boundary
        int left = stack[x++];
        //Simulate stack popout right boundary
        int right = stack[x++];
        if (x == DIM) x = 0;    // wrap around
        // Call partition function 
        int pos = partion(a, left, right);
        //if Meet the conditions, repress the stack
        if (left < pos - 1)
        {
            stack[y++] = left;
            stack[y++] = pos - 1;
            if (y == DIM) y = 0;    // wrap around
            if (y == x) puts("FIFO full"), exit(1);
        }
        if (pos + 1 < right)
        {
            stack[y++] = pos + 1;
            stack[y++] = right;
            if (y == DIM) y = 0;    // wrap around
            if (y == x) puts("FIFO full"), exit(1);
        } 
    }
#定义堆栈的尺寸/sizeof*堆栈//尺寸必须为偶数
while(x!=y)
{
//模拟堆栈弹出左边界
int left=堆栈[x++];
//模拟堆栈弹出右边界
int right=堆栈[x++];
如果(x==DIM)x=0;//环绕
//调用配分函数
int pos=分区(a、左、右);
//如果满足条件,则抑制堆栈
如果(左<位置-1)
{
堆栈[y++]=左侧;
堆栈[y++]=pos-1;
如果(y==DIM)y=0;//环绕
如果(y==x)放入(“FIFO已满”),则退出(1);
}
如果(位置+1<右侧)
{
堆栈[y++]=pos+1;
堆栈[y++]=右侧;
如果(y==DIM)y=0;//环绕
如果(y==x)放入(“FIFO已满”),则退出(1);
} 
}

调用
非递归快速排序(a,0,10)
是错误的,因为这会导致在
部分中引用[10];正确的是
非递归快速排序(a,0,9)

重用先前丢弃的空间(其中X已被遍历)

为此,名为
stack
的FIFO中的索引
x
y
将环绕在数组的末尾。这是
非递归快速排序中循环的修订版本,还带有防止溢出的检查:

    #define DIM sizeof stack / sizeof *stack    // DIM must be even
    while (x != y)
    {
        // Simulate stack popout left boundary
        int left = stack[x++];
        //Simulate stack popout right boundary
        int right = stack[x++];
        if (x == DIM) x = 0;    // wrap around
        // Call partition function 
        int pos = partion(a, left, right);
        //if Meet the conditions, repress the stack
        if (left < pos - 1)
        {
            stack[y++] = left;
            stack[y++] = pos - 1;
            if (y == DIM) y = 0;    // wrap around
            if (y == x) puts("FIFO full"), exit(1);
        }
        if (pos + 1 < right)
        {
            stack[y++] = pos + 1;
            stack[y++] = right;
            if (y == DIM) y = 0;    // wrap around
            if (y == x) puts("FIFO full"), exit(1);
        } 
    }
#定义堆栈的尺寸/sizeof*堆栈//尺寸必须为偶数
while(x!=y)
{
//模拟堆栈弹出左边界
int left=堆栈[x++];
//模拟堆栈弹出右边界
int right=堆栈[x++];
如果(x==DIM)x=0;//环绕
//调用配分函数
int pos=分区(a、左、右);
//如果满足条件,则抑制堆栈
如果(左<位置-1)
{
堆栈[y++]=左侧;
堆栈[y++]=pos-1;
如果(y==DIM)y=0;//环绕
如果(y==x)放入(“FIFO已满”),则退出(1);
}
如果(位置+1<右侧)
{
堆栈[y++]=pos+1;
堆栈[y++]=右侧;
如果(y==DIM)y=0;//环绕
如果(y==x)放入(“FIFO已满”),则退出(1);
} 
}

你永远不会从堆栈中弹出任何东西……我使用x++来刺激堆栈的弹出,当x==y时,数组中用于刺激堆栈的所有元素都弹出@蒋浩楠 - 您的数据结构虽然存储为一个名为
stack
的数组,但它不是一个堆栈,而是一个FIFO;数据存储在一个滑动的、可变大小的数组切片中。您从不从堆栈中弹出任何内容……我使用x++来激发堆栈的弹出,当x==y时,数组中用于激发堆栈的所有元素都弹出@蒋浩楠 - 您的数据结构虽然存储为名为
stack
的数组,但它不是堆栈,而是FIFO;数据存储在一个可变大小的滑动数组切片中。