我编写了以下快速排序算法的实现。我无法猜测为什么下面的代码片段无法正常工作(编译良好但无法在运行时运行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);
}
答案 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。 - 如果在项目上工作,也要提供函数原型,否则忽略它。