У меня есть следующий кодпонимание этого алгоритма слияния?
void mergesort(int size, int ar[], int temp[])
{
if(size <=1)
{
return;}
else
{
int i = 0;
int mid = size/2;
int *left = &ar[0];
int *right = &ar[mid];
int *rend = &ar[size];
int *lend = right;
mergesort(mid,left,temp);
mergesort(size-mid,right,temp);
for(i=0; i<size;i++)
{
if(left < lend && (*left < *right || right >= rend))
{
temp[i] = *left++;
}
else
{
temp[i] = *right++;
}
}
for(i = 0; i < size; i++)
{
ar[i] = temp[i];
}
}
}
Я не мог понять, как это работает, если заявление:
if(left < lend && (*left < *right || right >= rend))
{
temp[i] = *left++;
}
else
{
temp[i] = *right++;
}
Можете ли вы сказать мне, что там происходит? Почему мы должны сравнивать адреса? (Слева < одолжить и право> = разрывать)
Вот как функция называется слиянием с главной
const int SIZE = 8;
int array[SIZE] = {3,6,1,-9,0,2,4,5};
int temp[SIZE];
mergesort(SIZE, array,temp);
Поскольку массивы хранятся в виде последовательных адресов памяти? – Hariprasad
Подумайте, что произойдет, если вы этого не сделаете. Что бы предотвратить считывание с концов (под) массивов? –
Тем не менее, этот код выглядит сломанным для меня. Если 'right' достигает конца массива, то он по-прежнему разыменовывается в' * left <* right', который вызывает неопределенное поведение. –