這裏是我的程序是編譯和不通過語法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=p
和j=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);
}
}
-1:你有沒有嘗試在小數據集中的調試器中逐步調試代碼?你發現了什麼? –
究竟是什麼問題?什麼不起作用? – iceaway
@iceway當功能分區發生交換時發生然後我嘗試在那裏打印數組本身(它不是排序數組,但只是爲了看到達到的事情)然後我看到只有2或3個元素的數組正在打印和休息的數組在某處丟失。 –