为什么这个合并排序不起作用?它给出相同的未排序数组

Het*_*tel 0 c sorting merge data-structures

我编写了这段代码来实现合并排序,它从用户处获取输入数组并使用合并排序对该数组进行排序。但它会给出与输入相同的输出。

我还将临时数组 ( temp[]) 复制到array[].

请检查我的代码并给我解决方案,谢谢。

#include <stdio.h>

void merge(int array[], int mid, int low, int high) {
    int i, j, k, temp[100];
    
    i = low;
    k = low;
    j = mid + 1; 
    
    while (i <= mid && j <= high) {
        if (array[i] < array[j]) {
            temp[k] = array[i];
            i++;
            k++;
        } else {
            temp[k] = array[j];
            j++;
            k++;
        }
    }
    
    while (i <= mid) {
        temp[k] = array[i];
        i++;
        k++;
    }
    
    while (j <= high) {
        temp[k] = array[j];
        j++;
        k++;
    }
    
    for (int i = low; i <= high; i++) {
        array[i] = temp[i];
    }
}

void mergeSort(int array[], int low, int high) {
    int mid;
    if (low < high) {
        mid = (low + mid) / 2;
        mergeSort(array, low, mid);
        mergeSort(array, mid + 1, high);
        merge(array, mid, low, high);
    }
}

void printArray(int *array, int n) {
    for (int i = 0; i < n; i++) {
        printf("%d  ", array[i]);
    }
    printf("\n");
}

void main() {
    int array[100], n, target, p;
   
    printf("How many number you want to insert?\n");
    scanf("%d", &n);
   
    // printf("Target: ");
    // scanf("%d", &target);
   
    for (p = 0; p < n; p++) {
        scanf("%d", &array[p]);
    } 
    
    printArray(array, n);
    mergeSort(array, 0, n);
    printArray(array, n);
}
Run Code Online (Sandbox Code Playgroud)

这是我的输出

输出:

#include <stdio.h>

void merge(int array[], int mid, int low, int high) {
    int i, j, k, temp[100];
    
    i = low;
    k = low;
    j = mid + 1; 
    
    while (i <= mid && j <= high) {
        if (array[i] < array[j]) {
            temp[k] = array[i];
            i++;
            k++;
        } else {
            temp[k] = array[j];
            j++;
            k++;
        }
    }
    
    while (i <= mid) {
        temp[k] = array[i];
        i++;
        k++;
    }
    
    while (j <= high) {
        temp[k] = array[j];
        j++;
        k++;
    }
    
    for (int i = low; i <= high; i++) {
        array[i] = temp[i];
    }
}

void mergeSort(int array[], int low, int high) {
    int mid;
    if (low < high) {
        mid = (low + mid) / 2;
        mergeSort(array, low, mid);
        mergeSort(array, mid + 1, high);
        merge(array, mid, low, high);
    }
}

void printArray(int *array, int n) {
    for (int i = 0; i < n; i++) {
        printf("%d  ", array[i]);
    }
    printf("\n");
}

void main() {
    int array[100], n, target, p;
   
    printf("How many number you want to insert?\n");
    scanf("%d", &n);
   
    // printf("Target: ");
    // scanf("%d", &target);
   
    for (p = 0; p < n; p++) {
        scanf("%d", &array[p]);
    } 
    
    printArray(array, n);
    mergeSort(array, 0, n);
    printArray(array, n);
}
Run Code Online (Sandbox Code Playgroud)

Tom*_*zes 5

有两个错误。第一个是在mergeSort

mid = (low + mid)/2;
Run Code Online (Sandbox Code Playgroud)

它尝试mid根据自身进行定义,但它仍然是一个未定义的值。将其更改为:

mid = (low + high)/2;
Run Code Online (Sandbox Code Playgroud)

第二个错误是在main对 的调用中mergeSort

mergeSort(array, 0, n);
Run Code Online (Sandbox Code Playgroud)

这是一个相差一的错误,因为mergeSort包含下限和上限。将其更改为:

mergeSort(array, 0, n-1);
Run Code Online (Sandbox Code Playgroud)

通过这两个修复,代码可以按预期工作:

How many number you want to insert?
4
6
4
7
5
6  4  7  5  
4  5  6  7  
Run Code Online (Sandbox Code Playgroud)