C Сортировка слияния в бесконечном цикле

65
5

Моя программа использует рекурсию для деления и покорения, но я получаю бесконечный цикл из-за неизвестных причин. и я все еще получаю несортированный массив в качестве ответа

/**
* MergeSort.c
*
* Uses recursion for divide and conquer
*
*
* Implements merge sort for an array
*/

Инициализация метода вызывает слияние и сортировку слияния

#include<stdio.h>
#include<conio.h>
void merge(int array[6],int beg,int mid,int end);
void mergesort(int array[6],int beg,int end);

Инициализировать функции отображения

void display(int array[6]);

int main(void)
{
// Initializes the array
int array[6]={3,1,2,9,5,4};
// Initialize the beginning and the end
int beg=0, end=5;
// Implement the Merge Sort
mergesort(array,beg,end);
getch();
}

void mergesort(int array[6],int beg,int end) //Calls Initial merge sort
{
int mid;
mid=(beg+end)/2;
while (beg<end)
{
mergesort(array,beg,mid); //Left part of the array
mergesort(array,mid+1,end); //Right part of the array
merge(array,beg,mid,end); //merge two sorted arrays
}
}

//merges two subarrays
void merge(int array[6],int beg,int mid,int end)
{
int temp[6]; //Declare a temp array for storing the sorted elements
int k=beg;
int i=beg; //initialize the pointers for two sub arrays
int j=mid;

while (i<mid && j<end)
{
if(array[i]<array[j])
{
temp[k]=array[i];
i++;
k++;
}
else
{
temp[k]=array[j];
j++;
k++;
}
}

//Clearing any remaining elements in the sub array
while (i<mid)
{
temp[k]=array[i];
i++;
k++;
}

//Clearing any remaining elements in the sub array
while (j<end)
{
temp[k]=array[j];
j++;
k++;
}

//Reassign the sorted elements to the original array
for(i=0,k=0;i<end,k<end;i++,k++)
{
array[i]=temp[k];
}
//prints the individual array elements
display(array); //display array
}

//Displays the entire array

void display(int array[6])
{
//prints the individual array elements
for (int i=0;i<6;i++)
{
printf("%d ",array[i]); //prints the individual array elements
}
printf("\n"); //Enter a new line after every iteration
}

спросил(а) 2021-01-19T18:02:43+03:00 9 месяцев назад
1
Решение
101

Ну, из функции mergesort,

while (beg<end)
{
mergesort(array,beg,mid); //Left part of the array
mergesort(array,mid+1,end); //Right part of the array
merge(array,beg,mid,end); //merge two sorted arrays
}

beg и end не будут изменены. Поэтому он будет делать что-то в этом цикле навсегда. Я думаю, вы должны изменить из в то время как в случае.

И более того, если ваш конец равен 5 (последний индекс в этом массиве/сегменте), последний элемент в сегменте не будет отсортирован. Это означает, что этот массив не будет сортироваться. Вы должны перейти на...

 while (i<mid && j<=end) //from j<end to j<=end and for another loop
{
if(array[i]<array[j])
{
temp[k]=array[i];
i++;
k++;
}
else
{
temp[k]=array[j];
j++;
k++;
}
}

Удачи на DQ <3

ответил(а) 2021-01-19T18:02:43+03:00 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема