a.exe已停止使用quicksort程序

时间:2013-06-19 05:12:45

标签: 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);

}

3 个答案:

答案 0 :(得分:0)

问题就在这里:

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: warning: ‘last’ may be used uninitialized in this function [-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端口,微软也有自己的调试器。没有借口不使用它。

答案 1 :(得分:0)

也许你错过了一个警告 ‘last’ may be used uninitialized in this function

首次使用last而不进行初始化会导致分段错误,因此您的exe无法正常工作。

答案 2 :(得分:0)

此代码段中有两个问题。 一个是通用编码规则,即每个变量都应该使用一个值进行初始化,否则可能会发生变量可能会占用垃圾值并产生意外输出。其次,您的算法存在问题。在您调用交换功能的函数快速排序中,要传递的正确参数是&#34;交换(a,左,( +右)/ 2);&#34;

P.S。 - 如果在项目上工作,也要提供函数原型,否则忽略它。