2017-01-01 6 views
-4

Ошибка «Pindex» не была объявлена ​​в этой области. (Линия 15)
Кроме того, в чем разница между объявить массив в функции сОшибка в программе быстрой сортировки

int a[] 

и

int a* 

и предложить некоторые ресурсы для explainatio сортировочных алгоритмов.

#include<iostream> 
using namespace std; 

int Partition(int a[], int start, int last); 
void QuickSort(int a[], int start, int last) 
{ 

/*if(start>=last) 
{ 
    return ; 
}*/ 
{ if(start<last) 

    int Pindex=Partition(a, start, last); 
    QuickSort(a, start, Pindex-1); 
    QuickSort(a,Pindex+1, last); 
} 


} 

int Partition(int a[] ,int start, int last) 
{ 

int temp; 
int Pindex=start; 
int pivot=a[last]; 
for (int i=0;i<last;i++) 
{ 

    if(a[i]<=pivot) 
    { 
     temp=a[i]; 
     a[i]=a[Pindex]; 
     a[Pindex]=temp; 
     Pindex++; 
    } 
} 
temp=a[Pindex]; 
a[Pindex]=a[last]; 
a[last]=temp; 
return Pindex; 

} 

int main() 
{ 
int n; 
cout<<"\n Enter the no of elements "; 
cin>>n; 
cout<<"\n Enter the elements "; 
int A[n]; 

for (int i=0;i<n;i++) 

{ 

cin>>A[i]; 

} 
QuickSort(A,0,n-1); 
cout<<"\n Sorted Array "; 

for (int i=0;i<n;i++) 
{ 

    cout<<A[i]; 

} 
return 0; 


} 
+2

'Pindex' объявляется только в рамках инструкции' if'. Это было бы ясно, если вы добавите фигурные скобки: 'if (start

+1

В качестве параметра функции нет абсолютно никакой разницы между' int a [] 'и' int * a'. Вы можете даже объявить функцию одним способом, а затем определить ее другим способом. –

+0

a * даст ошибку. * a - указатель. a [10] - массив. – stark

ответ

1

После просмотра в соответствующем исходном коде, главная проблема находится в функции Partition(). Местный int Pindex в QuickSort() больше не проблема, чем использование рекурсивного вызова, чтобы вызвать ошибку Segmantation Fault.

В функции устранения неполадок int Partition(int a[] ,int start, int last), входные аргументы start и last, но для цикла, , где Pindex увеличивается продолжает быть for (int i=0;i<last;i++) и вызовет Pindex больше, чем last и последней инверсии a[Pindex]=a[last]; будет вызывают ошибку записи.

для-петель должны быть сделано на тот же диапазон входных аргументов, как следующие:

int Partition(int a[] ,int start, int last) 
{ 
    int temp; 
    int Pindex=start; 
    int pivot=a[last]; 
    // for-loop to the range [start;last[ 
    for (int i=start;i<last;i++) 
    { 
     if(a[i]<=pivot) 
     { 
      temp=a[i]; 
      a[i]=a[Pindex]; 
      a[Pindex]=temp; 
      Pindex++; 
     } 
    } 
    temp=a[Pindex]; 
    a[Pindex]=a[last]; 
    a[last]=temp; 
    return Pindex; 
} 

Тогда все работает при исправлении опечатки QuickSort.

void QuickSort(int a[], int start, int last) 
{ 
    /*if(start>=last) // to be deleted 
    { 
    return ; 
    }*/ 
    if(start<last) { 
     int Pindex=Partition(a, start, last); 
     QuickSort(a, start, Pindex-1); 
     QuickSort(a,Pindex+1, last); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^