2013-10-05 6 views
0

Я пытаюсь реализовать алгоритм сортировки слиянием. Я выполняю алгоритм, упомянутый в КСПСЕ book.Here моего кодОшибка сортировки слияния C

#include<stdio.h> 
#include<stdlib.h> 
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++];} 

    }} 

Я получаю следующий вывод

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

Поскольку я беру небольшие целые числа, я взял 100 в качестве sentinel value. Я думаю, что что-то не так с функцией слияния. Любая помощь оценивается.

+0

На первый взгляд: '' L' и M' по всей видимости, неиницализированные. (вы можете легко проверить это, поставив несколько инструкций printf() в стратегических точках программы). Также настоятельно рекомендуем использовать неподписанные типы для индексов (unsigned не может переполняться, а складывается вокруг modulo wordsiz) и добавлять в код некоторые утверждения/проверки. – wildplasser

+0

Они были инициализированы непосредственно перед финалом для блока. – fts

+0

Это означает, что они ** всегда ** ноль. BTW: пожалуйста, не обновляйте вопрос, чтобы исправить ошибки. – wildplasser

ответ

1

Проблема очень проста: у вашего последнего loop в merge(...) есть проблема.

Переместите l = 0 и m = 0 до начала цикла, поскольку вы используете значения 0 и 1 для l и m всегда, в каждой итерации цикла.

Изменить его:

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

} 
Смежные вопросы