C中的合并排序返回一个包含3-4个相同数字的列表,其他数字在排序列表中丢失

8ehkhllq  于 2023-03-01  发布在  其他
关注(0)|答案(1)|浏览(143)

我试图用C实现一个基本的合并排序程序。但是,我总是在一行中得到相同数字的多个示例,而其他数字完全被跳过。

void merge_sort(int *arr, int left, int right){
    if (left<right){
        int mid = left + (right-left)/2;

        merge_sort(arr, left, mid);
        merge_sort(arr, mid+1, right);

        merge(arr, left, mid, right);
    }
}

void merge(int *arr, int left, int mid, int right){
    int lenght1 = mid - left + 1;
    int lenght2 = right - mid;
    int left_arr[lenght1];
    int right_arr[lenght2];

    int i, j;
    for (i=0; i<lenght1; i++)
        left_arr[i] = arr[left+i];
    for (j=0; j<lenght2; j++)
         right_arr[j] = arr[mid + 1 + j];

    i=0;
    j=0;
    int k = left;
    while(i<lenght1 && j<lenght2){
        if (left_arr[i]<=right_arr[j]){ 
            arr[k] = left_arr[i]; 
            i++;
        }
        else{
            arr[k] = right_arr[j]; 
            j++;
        }
        k++;
    }
    while (j<lenght2){
        arr[k] = right_arr[j];
        j++;
        k++;
    }
}

void print_array(int array[], int length){
for (int i=0; i<length; i++)
    printf("%d ", array[i]);   
}

//MAIN FILE
#include <stdio.h> 
#include <stdlib.h>
#include "sorting.h"

#define ARR_LENGHT 8

int main(int argc, char *argv[]){
    int arr[ARR_LENGHT];
    if (argc!=ARR_LENGHT+1)
        printf("Too many or too few arguments passed.");
    else{
        for (int i=1; i<=ARR_LENGHT; i++)
            arr[i-1]=strtod(argv[i], NULL);
        merge_sort(arr, 0, ARR_LENGHT-1);
        print_array(arr, ARR_LENGHT);
    }
    return 0;
}

输入和输出示例:输入:6 5 4 3 2 1 8 9输出:1 1 3 3 3 3 8 9

iyfamqjs

iyfamqjs1#

对于初学者来说,不清楚为什么要使用设计用于解析双精度值的标准函数strtod,而不是strtol甚至atoi
至于函数定义,除了函数merge中的while循环

while (j<lenght2){
    arr[k] = right_arr[j];
    j++;
    k++;
}

还需要再添加一个while循环

while (i<lenght1){
    arr[k] = left_arr[i];
    i++;
    k++;
}

那就是你将拥有

while (j<lenght2){
    arr[k] = right_arr[j];
    j++;
    k++;
}

while (i<lenght1){
    arr[k] = left_arr[i];
    i++;
    k++;
}

while循环的顺序并不重要。
此外,函数merge应在函数merge_sort之前声明。

相关问题