Я пытаюсь переписать рекурсивный Merge Сортировать какПоследовательная сортировка слияния в C
void MergeSort(int* data, int size){
int half=size/2;
if (size > 1) {
MergeSort(data, half);
MergeSort(data+half, half);
Merge(data, size);
}
}
, в котором
void Merge(int* data, int size){
int cnt;
int cntLow=0;
int half=size/2;
int cntHigh=half;
int* sorted;
sorted = (int*) malloc(size*sizeof(int));
for (cnt=0; cnt<size; cnt++){
if (cntLow == half)
sorted[cnt] = data[cntHigh++];
else if (cntHigh == size)
sorted[cnt] = data[cntLow++];
else if (data[cntLow] <= data[cntHigh])
sorted[cnt] = data[cntLow++];
else
sorted[cnt] = data[cntHigh++];
}
for (cnt=0; cnt<size; cnt++)
data[cnt] = sorted[cnt];
free(sorted);
}
к нерекурсивен вызову. Поэтому я написал функцию
void MergeSort_NonRecursive(int* data, int size){
int i;
int j;
for (i=size; i>0; i=i/2){
for (j=0; j<i; j++){
Merge(data + j*size/i, size/i);
}
}
}
, который, по-видимому, работает для последовательностей размером $ 2^n $. Однако, когда я запускаю его в последовательности размером, отличной от $ 2^n $, он не сортируется правильно, поэтому в какой-то точке MergeSort_NonRecursive
мой код должен быть ошибочным.
Итак, где я сделал неправильно (в MergeSort_NonRecursive
)? (также, мне нужно использовать функцию Merge
).
Заранее спасибо.
Когда размер нечетный, у вас есть элементы «половина + половина + 1». Вы должны использовать 'size-half' в одном из рекурсивных вызовов. –