Fusionner le sorting d’erreur C

J’essaie d’implémenter l’algorithme de sorting par fusion. Je suis l’algorithme mentionné dans le livre de CLRS. Voici mon code

#include #include void merge_sort(int *arr,int start_index,int end_index); void merge(int *arr,int start_index,int middle_index,int end_index); int main(){ int arr[]={5,2,1,6,0,3,3,4}; //8 elements last index 7 int i; printf("Before sorting.\n"); for(i=0;i<8;i++) printf("%d",arr[i]); merge_sort(arr,0,7); printf("\nAfter sorting.\n"); for(i=0;i<8;i++) printf("%d",arr[i]); return 0;} void merge_sort(int *arr,int start_index,int end_index){ int middle_index; if(start_index<end_index) { middle_index=(start_index+end_index)/2; merge_sort(arr,start_index,middle_index); merge_sort(arr,(middle_index+1),end_index); merge(arr,start_index,middle_index,end_index); } } void merge(int *arr, int start_index,int middle_index, int end_index){ int n1,n2,i,l,m; n1=middle_index-start_index+2; n2=end_index-middle_index+1; int sub_arr1[n1],sub_arr2[n2]; for(i=0;i<(n1-1);i++) sub_arr1[i]=arr[i]; for(i=0;i<(n2-1);i++) sub_arr2[i]=arr[middle_index+1+i]; sub_arr1[n1+1]=100; sub_arr2[n2+1]=100; for(i=0;i<=end_index;i++){ l=0,m=0; if(sub_arr1[l]<sub_arr2[m]) {arr[i]=sub_arr1[l++];} else {arr[i]=sub_arr2[m++];} }} 

Je reçois la sortie suivante

 Before sorting. 52160334 After sorting. 22222222 RUN FINISHED; exit value 0; real time: 10ms; user: 0ms; system: 0ms 

Depuis que je prends de petits nombres entiers, j’ai pris 100 comme sentinel value . Je suppose qu’il y a quelque chose qui ne va pas avec la fonction de fusion. Toute aide appréciée.

Le problème est très simple: votre dernière loop dans la merge(...) a un problème.

Déplacez l = 0 et m = 0 avant le début de la boucle, car vous utilisez toujours les valeurs 0 et 1 pour l et m, à chaque itération de la boucle.

Changez le en:

 int l=0, m=0; for(i=0;i<=end_index;i++){ if(sub_arr1[l]