У меня есть следующий код для быстрого сортировки. Хотя массив передается по ссылке как в functions-, так и в quicksort, я не мог понять, почему измененный массив не отображается в результате. В какой-то книге я увидел, что прототип quicksort был определен внутри основной функции. Но это тоже не сработало. Также скажите, разрешено ли определять прототип другой функции внутри main.
#include <iostream>
void quicksort(int *,int,int);
int split(int *,int,int);
using namespace std;
int main()
{
cout<<"\n Enter the 10 elements : ";
int n=10;
int a[10];
for(int i=0;i<10;i++)
{
cin>>a[i];
}
quicksort(a,0,9);
cout<<"\nThe sorted array is: ";
for(int c=0;c<10;c++)
{
cout<<a[c]<<" ";
}
return 0;
}
void quicksort(int arr[],int lower,int upper)
{
int i;
if(upper<lower)
{
i=split(arr,lower,upper);
quicksort(arr,lower,i-1);
quicksort(arr,i+1,upper);
}
}
int split(int arr[],int lower, int upper)
{
int i,a,b,temp;
a=lower+1;
b=upper;
i=arr[lower];
while(b>=a)
{
while(arr[a]<i)
a++;
while(arr[b]>i)
b++;
if(b>a)
{
temp=arr[a];
arr[a]=arr[b];
arr[b]=temp;
}
}
temp=arr[lower];
arr[lower]=arr[b];
arr[b]=temp;
return b;
}
Другая ошибка:
while(arr[b]>i)
b++;
должно быть
while(arr[b]>i)
b--;
Еще одна ошибка:
while(arr[a]<i)
a++;
должно быть:
while(arr[a]<=i)
a++;
вердикт: реализация алгоритма багги
Здесь ошибка:
if(upper<lower)
Поскольку upper
сначала больше, чем lower
, функция quicksort
немедленно прекращается. Сравнение должно быть наоборот. (За исключением того, что программа segfaults, когда я пытаюсь это сделать, но это другая проблема.)