2011-06-21 44 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 –