c - a.exe 已停止运行快速排序程序

标签 c quicksort

我编写了以下快速排序算法的实现。我无法猜测为什么以下代码片段不起作用(编译良好但无法在运行时运行 a.exe 已停止工作)。如果有人你可以在这方面帮助我:

main( )
{
    int a[ ]={9,2,3,1,6,5,6,3,2,9,8,1,4,5,5,6,5,99};
    quicksort(a,0,17);
    print(a,18);    

}

void print(int a[ ],int n)
{
int i;
for (i=0;i<n;i++)
        printf("%d\n",a[i]);
} 

   void swap(int a[ ],int left,int right)
      {
        int t;
        t=a[left];
            a[left]=a[right];
            a[right]=t;
     }

   void quicksort(int a[ ],int left,int right)
   {
    int i,last;
        if ( left >= right)
            return;
    swap(a,left,(last+right)/2);
        last=left;
        for (i=last+1;i<=right;i++)
            if (a[i] < a[left])
                swap(a,++last,i);
        swap(a,left,last);
        quicksort(a,left,last-1);
        quicksort(a,last+1,right);

}

最佳答案

问题就在这里:

void quicksort(int a[ ],int left,int right)
{
    int i,last;
    if ( left >= right)
        return;
    swap(a,left,(last+right)/2);
                 ^^^^

last 尚未初始化,但您将其用作 right 的补充。

您是指(left+right)/2吗?

我的编译器不仅警告我(始终启用警告),而且我进一步使用调试器来仔细检查情况确实如此。

编译器警告:

23:22:警告:在此函数中可能会使用未初始化的“last”[-Wuninitialized]

调试器输出:

Breakpoint 2, main () at quicksortbroken.c:37
37      int a[ ]={9,2,3,1,6,5,6,3,2,9,8,1,4,5,5,6,5,99};
(gdb) n // go to the next line
38      quicksort(a, 0, 17);
(gdb) s // step into the function
quicksort (a=0xbffff6d8, left=0, right=17) at quicksortbroken.c:21
21      if ( left >= right)
(gdb) n 
23      swap(a,left,(last+right)/2); // okay, let's examine the variable I suspect is problematic
(gdb) p last // print the value of last
$1 = 1872329 // Oh, oh, definitely not supposed to be this value

这是在 Linux 下使用 GDB,不确定你是如何编译代码的,但我很确定 Cygwin 附带了 GDB 的 Windows 端口,微软也有自己的调试器。没有理由不使用它。

关于c - a.exe 已停止运行快速排序程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17183312/

相关文章:

c++ - 大端和小端 float 有什么区别?

c - C中的快速排序实现

sorting - Haskell 中的快速排序

c - 具有段错误的快速排序程序

ios - n 个元素的组合选择 r 个元素而不重复(Objective-c)

c - 在 C 中扩展矩阵

c - Libmemcached 为每个获取和设置请求创建套接字

c - 头文件中的 typedef 结构体 c 文件中的结构体定义

algorithm - QuickSort对递归深度的估计

c - 快速排序 float 最终仅显示 0,00