2011-06-21 34 views
1

这里是我的程序是编译和不通过语法errors.How运行以往并不排序array.The问题出在哪里我传递的数组中的功能无法通过阵列中正确快速排序

#include<stdio.h> 
#include<string.h> 
int partition (int *,int,int); 
void quicksort (int *,int,int); 
static int call=0; 
int main() 
{ 
int i,j,choice; 
int length; 
int a[]={81, 12, 90, 3, 49, 108, 47}; 
i=0; 

length=sizeof(a)/sizeof(a[0]); 
quicksort(a,0,length-1); 
printf("the sorted array is\n"); 
for(i=0;i<length;i++) 
printf (" %d ",a[i]); 
} 
int partition(int *num,int p,int r) 
{ 
int x,j,i,temp,bak; 
    x=num[r]; 
    i=p-1; 
     for(j=0;j<=r-1;j++) 
    { 
     if(num[j]<=x) 
    { 
     i=i+1; 
     temp=num[i]; 
     num[i]=num[j]; 
     num[j]=temp; 


     { 
     printf(" %d",num[bak]); 
     } 

    } 
    } 
    num[i+1]=num[r]; 

return i+1; 
} 

void quicksort (int *num,int p,int r) 
{ 
int q; 
if (p<r) 
    { 
    call++; 

    q=partition(num,p,r); 
     quicksort(num,p,q-1); 
     quicksort(num,q+1,r); 
    } 
}  

在函数中传递数组的上述方式是正确的,这是我想知道的,因为这是在功能分区中给出问题。

在交换发生时,函数分区内部,然后我尝试在那里打印数组本身(它不是排序数组,但只是看到达到了什么点)然后我看到只有2或3个元素的数组,正在被打印,数组的其余部分丢失了一些地方。所以我的疑问是数组没有正确传递。

为了能够看到的有什么用数组传递一个功能我写了一个小程序ka1.c

#include<stdio.h> 
void pass(int *); 
int main() 
{ 
int a[]={3,5,61,32,12}; 
pass(a); 
} 
void pass (int *num) 
{ 
int i,j; 
j=sizeof(num)/sizeof(num[0]); 
for (i=0;i<j;i++) 
printf(" %d",num[i]); 
} 

现在的问题,当我运行上面的代码,我得到的输出只是

3 5 

我期待完整的数组被打印在ka1.c的输出中。 就好像你注意到阵列的其余部分没有被打印出去那里呢? 我在quicksort中也使用了相同的逻辑,因此我觉得这两种情况下的错误都是一样的。

UPDATE1
下面我的注释后经由

sizeof(num)/sizeof(num[0]); 

检查阵列中quicsort.c paritition功能收到的长度,发现原数组

int a[]={81, 12, 90, 3, 49, 108, 47}; 

其具有长度的7这里当我通过它在功能分区 的长度只有2. 程序ka也是如此1.c那么为什么在这两种情况下只有长度是2?

UPDATE2
正如我在长度也

#include<stdio.h> 
#include<string.h> 
int partition (int *,int,int,int); 
void quicksort (int *,int,int,int); 
static int call=0; 
int main() 
{ 
int i,j,choice; 
int length; 
int a[]={81, 12, 90, 3, 49, 108, 47}; 
i=0; 
printf("the sorted array is\n"); 
length=sizeof(a)/sizeof(a[0]); 
printf("length of array %d\n",length); 
printf("quick sort called in main\n"); 
quicksort(a,0,length-1,length); 
for(i=0;i<length;i++) 
printf (" %d ",a[i]); 
} 
int partition(int *num,int p,int r,int june) 
{ 
int x,j,i,temp,bak,length; 
    x=num[r]; 
    i=p-1; 
    bak=0; 
    printf("inside the partition\n"); 
printf("length of june recieved =%d \n",june); 
    for(j=0;j<=r-1;j++) 
    { 
    if(num[j]<=x) 
    { 
     i=i+1; 
     temp=num[i]; 
     num[i]=num[j]; 
     num[j]=temp; 
    printf("printing array after swap\n"); 
     for(;bak<7;bak++) 
     { 
      printf(" %d ",num[bak]); 
      } 
    } 
    } 
    num[i+1]=num[r]; 

return i+1; 
} 

void quicksort (int *num,int p,int r,int june) 
{ 
int q,bbc,ccd; 
if (p<r) 
    { 
    call++; 
     printf("partition called %d times p=%d r=%d\n",call,p,r); 
    printf("before sending to function length of june=%d \n",june); 
    q=partition(num,p,r,june); 
    bbc=q-1-p+1; 
     quicksort(num,p,q-1,bbc); 
     ccd=r-q-1+1; 
     quicksort(num,q+1,r,ccd); 
    } 
} 

通过,但该方案仍无法打印排序后的数组下面给出现在的建议。 你可以编译并运行上面的代码。

求解
最后,在下面的回复的帮助下,我已经能够解决上述问题。 这个错误在功能分区谎称声明

for (j = 0; j <= r - 1; j++) 

相反,它应该已经

for (j = p; j <= r - 1; j++) 

j=pj=0 这里

J = 0

是因为当递归错误第二个分区尝试进行排序,开始令人不安第一个分区,因此结果也是错误的。

在这个程序中,我遇到了使用gdb调试递归函数的问题。 请检查this thread也 调试recurssion是相当棘手。

所以正确的代码是

#include<stdio.h> 
#include<string.h> 
int partition (int *, int, int, int); 
void quicksort (int *, int, int, int); 
static int call = 0; 
int 
main() 
{ 
    int i, j, choice; 
    int length; 
    int a[] = { 81, 12, 90, 3, 49, 108, 47 }; 
    i = 0; 
    printf ("the sorted array is\n"); 
    length = sizeof (a)/sizeof (a[0]); 
    printf ("length of array %d\n", length); 
    printf ("quick sort called in main\n"); 
    quicksort (a, 0, length - 1, length); 
    for (i = 0; i < length; i++) 
    printf (" %d ", a[i]); 
} 

int 
partition (int *num, int p, int r, int june) 
{ 
    int x, j, i, temp, bak, length; 
    x = num[r]; 
    i = p - 1; 
    bak = 0; 
    for (j = p; j <= r - 1; j++) 
    { 
     if (num[j] <= x) 
    { 
     i = i + 1; 
     temp = num[i]; 
     num[i] = num[j]; 
     num[j] = temp; 
    } 
    } 
    temp=num[i+1]; 
    num[i + 1] = num[r]; 
    num[r]=temp; 
    return i + 1; 
} 

void 
quicksort (int *num, int p, int r, int june) 
{ 
    int q, bbc, ccd; 
    if (p < r) 
    { 
     call++; 
     q = partition (num, p, r, june); 
     bbc = q - 1 - p + 1; 
     quicksort (num, p, q - 1, bbc); 
    ccd=r-q+1; 
     quicksort (num, q + 1, r, ccd); 
    } 
} 
+0

-1:你有没有尝试在小数据集中的调试器中逐步调试代码?你发现了什么? –

+0

究竟是什么问题?什么不起作用? – iceaway

+0

@iceway当功能分区发生交换时发生然后我尝试在那里打印数组本身(它不是排序数组,但只是为了看到达到的事情)然后我看到只有2或3个元素的数组正在打印和休息的数组在某处丢失。 –

回答

2

的问题是,你正在计算德数组的长度的方式...... ....尝试简单地给数组中的元素的数量作为quicksort方法的参数....我想你会得到正确的答案... 也我同意的观点....尝试并传递阵列的长度与阵列.....试试两个,并告诉我哪些作品... :) 新代码:

#include<stdio.h> 
#include<string.h> 
//int partition (int *,int,int); 
void q_sort(int*,int,int); 
void quicksort (int *,int); 
static int call=0; 
int main() 
{ 
int i,j,choice; 
int length; 
int a[]={81, 12, 90, 3, 49, 108, 47}; 
i=0; 
printf("the sorted array is\n"); 
length=sizeof(a)/sizeof(a[0]); 
printf("length of array %d\n",length); 
printf("quick sort called in main\n"); 
quicksort(a,length); 
for(i=0;i<length;i++) 
printf (" %d ",a[i]); 
} 
/*int partition(int *num,int p,int r) 
{ 
int x,j,i,temp,bak,length; 
    x=num[r]; 
    i=-1; 
    bak=0; 
    printf("inside the partition\n"); 
    for(j=0;j<=r-1;j++) 
    { 
    if(num[j]<=x) 
    { 
     i=i+1; 
     temp=num[i]; 
     num[i]=num[j]; 
     num[j]=temp; 
    printf("printing array after swap\n"); 
     for(;bak<7;bak++) 
     { 
      printf(" %d ",num[bak]); 
      } 
    } 
    } 
    num[i+1]=num[r]; 

return i+1; 
} 
*/ 
/*void quicksort (int *num,int p,int r) 
{ 
int q,bbc,ccd; 
if (p<r) 
    { 
    call++; 
     printf("partition called %d times p=%d r=%d\n",call,p,r); 
    q=partition(num,p,r); 
    bbc=q-1-p+1; 
     quicksort(num,p,q-1); 
     ccd=r-q-1+1; 
     quicksort(num,q+1,r); 
    } 
}*/ 
void quicksort(int numbers[], int array_size) 
{ 
    q_sort(numbers, 0, array_size - 1); 
} 


void q_sort(int numbers[], int left, int right) 
{ 
    int pivot, l_hold, r_hold; 

    l_hold = left; 
    r_hold = right; 
    pivot = numbers[left]; 
    while (left < right) 
    { 
    while ((numbers[right] >= pivot) && (left < right)) 
     right--; 
    if (left != right) 
    { 
     numbers[left] = numbers[right]; 
     left++; 
    } 
    while ((numbers[left] <= pivot) && (left < right)) 
     left++; 
    if (left != right) 
    { 
     numbers[right] = numbers[left]; 
     right--; 
    } 
    } 
    numbers[left] = pivot; 
    pivot = left; 
    left = l_hold; 
    right = r_hold; 
    if (left < pivot) 
    q_sort(numbers, left, pivot-1); 
    if (right > pivot) 
    q_sort(numbers, pivot+1, right); 
} 
+0

@Abhimanyu Srivastava我已经给出了数组长度作为参数根据您的建议。但它没有给出排序的输出。 –

+0

@registered .... oke等我将自己运行它并检查.. –

+0

@Abhimanyu Srivastava在调试时遇到的一个重要错误是在fucntion分区'i = -1';我已经给出了在Coreman中它给出的位置因为'i = p-1;' –

1

你需要把一个;在函数声明的末尾main前:

void pass(int *) ; 
       ^
+0

伟大的指出这个错误我更新我的问题,请检查我要发布的输出。 –

+0

现在检查我已经更新了两个程序quicksort.c和ka1.c中收到的数组的长度,只有2个数字的整个输入。 –

+0

感谢您帮助解决这个错误。最终解决它。 +1为你的味精。 –

1

你必须通过阵列随着大小阵列本身。接收数组的函数无法确定其大小。接收函数只将num看作指针,所以当您使用sizeof(num)时,它会返回指针num的大小,而不是为main函数中的数组分配的内存大小。所以,你必须做这样的事情:

#include<stdio.h> 

void pass(int *, int); 
int main() 
{ 
    int a[]={3,5,61,32,12}; 
    int length; 
    length = sizeof(a)/sizeof(a[0]); 
    pass(a, length); 
} 
void pass (int *num, int size) 
{ 
    int i; 
    for (i=0;i<size;i++) 
     printf(" %d",num[i]); 
} 

这篇文章详细介绍了一个类似的问题: Passing an array as an argument in C++

+0

非常感谢您的指点,因为我已经能够最终解决它+1:D –