没有得到合并排序的输出

Not getting output for Merge Sort

我正在尝试这种归并排序。但我没有得到任何输出。意味着即使等待 2 分钟,它也不会在控制台屏幕上提供任何输出。你们中的任何人都请帮助我。我应该在哪里纠正自己。

#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void MergeSort();
void Merging();

int main() {
    int arr[100];
    int i;
    for (i = 0; i < 5; i++) {
        scanf("%d", &arr[i]);
    }
    printf("Unsorted\n");
    for (i = 0; i < 5; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    
    MergeSort(arr, 0, 4);
    
    printf("Sorted\n");
    for (i = 0; i < 5; i++) {
        printf("%d ", arr[i]);
    }
    
    return 0;
}

void MergeSort(int arr[], int l, int h) {
    if (l < h) {
        int mid = (l + h) / 2;
        MergeSort(arr, l, mid);
        MergeSort(arr, mid + 1, h);
        Merging(arr, l, mid, h);
    }
}

void Merging(int arr[], int l, int mid, int h) {
    int i1 = l, i2 = mid + 1, j1 = mid, j2 = h;
    int b[6];
    int k = l;
    while (i1 <= j1 && i2 <= j2) {
        if (arr[i1] < arr[i2]) {
            b[k++] = arr[i1++];
        } else {
            b[k++] = arr[i2++];
        }
    }
    while (i1 <= j1) {
        b[k++] = arr[i1];
    }
    while (i2 <= j2) {
        b[k++] = arr[i2];
    }
    int i;
    for (i = l; i <= h; i++) {
        arr[i] = b[i];
    }
}

我在其他网站上看到过使用两个不同的数组并首先存储主数组值然后合并两个数组。我想过用不同的方式来做。

您忘记了 Merging 中尾部处理中的索引递增。

ideone

while(i1<=j1){
    b[k++] = arr[i1++];
}
while(i2<=j2){
    b[k++] = arr[i2++];

代码没有在时间限制内执行,因为它遇到了无限循环。

需要进行一些更改:

  1. 函数声明应正确指定参数的数量和类型。

  2. 对于以下两个 while 循环,迭代器 i1i2 的值从未改变。因此造成死循环,屏幕上什么也没有显示。

     while(i1<=j1){
         b[k++] = arr[i1++];
     }
     while(i2<=j2){
         b[k++] = arr[i2++];
     }
    

查看以下更正后的代码:

#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void MergeSort(int arr[],int l,int h);
void Merging(int arr[], int l, int mid, int h);

int main(){
    int arr[100];
    int i;
    for(i=0;i<5;i++){
        scanf("%d",&arr[i]);
    }
    printf("Unsorted\n");
    for(i=0;i<5;i++){
        printf("%d ",arr[i]);
    }
    printf("\n");
    
    MergeSort(arr,0,4);
    
    printf("Sorted\n");
    for(i=0;i<5;i++){
        printf("%d ",arr[i]);
    }
    
    return 0;
}
void MergeSort(int arr[],int l,int h){
    if(l<h){
        int mid = (l+h)/2;
        MergeSort(arr,l,mid);
        MergeSort(arr,mid+1,h);
        Merging(arr,l,mid,h);
    }
}
void Merging(int arr[], int l, int mid, int h){
    int i1 = l,i2 = mid+1, j1 = mid, j2 = h;
    int b[6];
    int k=l;
    while(i1<=j1&&i2<=j2){
        if(arr[i1]<arr[i2]){
            b[k++] = arr[i1++];
        }else{
            b[k++] = arr[i2++];
        }
    }
    while(i1<=j1){
        b[k++] = arr[i1++];
    }
    while(i2<=j2){
        b[k++] = arr[i2++];
    }
    int i;
    for(i=l;i<=h;i++){
        arr[i] = b[i];
    }
}

测试:

输入:5 4 -1 3 1

输出:

Unsorted
5 4 -1 3 1 
Sorted
-1 1 3 4 5  

您忘记增加 i1 和 i2,这就是它生成无限循环并且控制台上没有显示输出的原因。

while(i1<=j1){
        b[k++] = arr[i1++];
}
while(i2<=j2){
        b[k++] = arr[i2++];