我试图用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
1条答案
按热度按时间iyfamqjs1#
对于初学者来说,不清楚为什么要使用设计用于解析双精度值的标准函数
strtod
,而不是strtol
甚至atoi
。至于函数定义,除了函数
merge
中的while循环还需要再添加一个while循环
那就是你将拥有
while循环的顺序并不重要。
此外,函数
merge
应在函数merge_sort
之前声明。