Я сделал рекурсивный код сортировки слиянием, но он не работает, может ли кто-нибудь сказать мне, где я ошибаюсь в коде.
void mergesort(int A[],int start,int end)
{
int B[(end-start)/2],C[(end-start)/2],i,j,k,flag=0;
if(start==end)
return;
else
{
mergesort(A,start,(start+end)/2);
mergesort(A,(start+end)/2+1,end);
}
for(i=start;i<(start+end)/2;i++)
B[i]=A[i];
for(i=(start+end)/2+1;i<end;i++)
C[i]=A[i];
for(i=start,j=start,k=(start+end)/2+1;i<end;i++)
{
if(j==(start+end)/2)
{
while(k!=end)
A[i]=C[k++];
flag=1;
}
if(k==end)
{
while(j!=(start+end)/2)
A[i]=B[j++];
flag=1;
}
if(flag)
break;
if(A[j]>C[k])
A[i]=C[k++];
else
A[i]=B[j++];
}
return;
}
В первой части кода я пытаюсь разделить массив на 2 подмассива, и если у меня остался только один элемент, я начинаю слияние и достигаю вершины, чтобы получить отсортированный массив.
IList<T>
как массив, вы сможете легко реализовать ее на C. Я не слишком внимательно смотрел на ваш код, потому что он потребует отладки. - person Lasse V. Karlsen   schedule 18.07.2014B
иC
могут быть не одинаковой длины (для нечетного числа элементов). И копия сA
наB
иC
не корректна. Индекс дляB
иC
необходимо сдвинуть, чтобы он начинался с 0. То же самое относится ко всем другим расчетам индекса. - person Nico Schertler   schedule 18.07.2014mid
и два подмассива будут [от начала до середины] и [от середины+1 до конца] и делают то же самое доstart < end
. так что дело в работе над индексами и отдельными функциями разделения и сортировки! держать вещи простыми .! ссылка [cormen the best] (personal.kent.edu/ ~rmuhamma/Алгоритмы/Мои Алгоритмы/Сортировка/) - person Hima   schedule 18.07.2014