Что-то не так в этом типе слияния

Я хочу отсортировать массив.
Так что я написал эту сортировку слиянием, она не делает то, что я хочу, то есть сортировка, просто глохнет!
Я повторяю алгоритм снова и снова, и я чувствую, что это так правильно, но нет!
пожалуйста, посмотрите и скажите мне, что может быть не так.

void mergeSort(int *arr, int low, int high){
int mid = (low+high)/2;
while(low<high){
mergeSort(arr, low, mid);
mergeSort(arr, mid+1, high);
merge(arr, low, high, mid);
}
}

void merge(int *arr,int low, int high, int mid){
int i =low,j=mid+1,k=0;
int temp[50];  // should i new/malloc this with size of ( high -low +1) ?
while(i<=mid && j<=high){
if(arr[i]<arr[j])
temp[k++] = arr[i++];
else
temp[k++] = arr[j++];
}
while(i<=mid)
temp[k++] = arr[i++];
while(j<=high)
temp[k++] = arr[j++];
for(int x = 0; x<=high; x++){
arr[x]=temp[x];
}
}

0

Решение

void mergeSort(int *arr, int low, int high){
int mid = (low+high)/2;
while(low<high){

если цикл введен вообще, это бесконечный цикл, так как ни low ни high изменены.

        mergeSort(arr, low, mid);
mergeSort(arr, mid+1, high);
merge(arr, low, high, mid);
}
}

void merge(int *arr,int low, int high, int mid){
int i =low,j=mid+1,k=0;
int temp[50];  // should i new/malloc this with size of ( high -low +1) ?

Да, вы должны определенно выделить правильный объем памяти.

    while(i<=mid && j<=high){
if(arr[i]<arr[j])

Это должно быть лучше arr[i] <= arr[j] иметь стабильный вид, хотя это не имеет значения для ints.

            temp[k++] = arr[i++];
else
temp[k++] = arr[j++];
}
while(i<=mid)
temp[k++] = arr[i++];
while(j<=high)
temp[k++] = arr[j++];
for(int x = 0; x<=high; x++){

Которые должны быть for(int x = low; ...,

        arr[x]=temp[x];

arr[x] = temp[x-low]; (или используйте два индекса).

    }
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]