2016-06-02 1 views
2

Так что это мой код для сортировки слияния. Но мне нужно выяснить, сколько раз были сделаны сравнения во время функции слияния. Для моего кода вывод count будет равен 0. Как мне изменить код, чтобы заставить счетчик работать?Подсчет количества сравнений для сортировки слияния

#include<stdio.h> 
#include<stdlib.h> 

void merge(int *array,int low, int mid, int high,int count) 
{ 
    int i=low, j=mid+1, n=low, f[high+1]; 

    while((i<=mid)&&(j<=high)) { 
    if(array[i]>array[j]){ 
      f[n]=array[j]; 
      j++; 
     }else{ 
      f[n]=array[i]; 
      i++; 
     } 
    n++; 
    count++; 
    } 

    if(i>mid) 
    while(n<=high) { 
    f[n]=array[j]; 
    n++; 
    j++; 
    } 

    if(j>mid) 
    while(n<=high) { 
    f[n]=array[i]; 
    n++; 
    i++; 
    } 
    for(n=low;n<=high;n++) 
     array[n]=f[n]; 
} 


void mergesort(int *array, int low, int high,int count) 
{ 
    int mid; 
    if(low<high){ 
     mid=(high+low)/2; 
     mergesort(array,low,mid,count); 
     mergesort(array,mid+1,high,count); 
     merge(array, low, mid, high,count); 
    } 
} 

int main() 
{ 
    int size,i, count=0, *f; 
    scanf("%d", &size); 
    f=(int *)malloc(sizeof(int)*size); 
    for(i=0;i<size;i++) 
    scanf("%d", &f[i]); 
    mergesort(f, 0, size-1,count); 
    for(i=0;i<size;i++) { 
     printf("%d",f[i]); 
     if(i==size-1) 
     printf("\n"); 
     else 
     printf(" "); 
    } 
    printf("%d\n", count); 
    return 0; 
} 
+1

Вместо того чтобы использовать '<' или '<=' и т.д., сделать функцию с именем 'lessThan' и увеличиваем счетчик внутри этой функции. –

+2

Параметры функции в C передаются по значению. Это означает, что изменение значения параметра внутри функции не изменяет исходную переменную, которую передал вызывающий. Таким образом, 'count' должен быть возвращен из вашей функции или передан как указатель. – kaylum

+1

хранить статическую переменную 'counter' и увеличивать ее в функции' mergesort' – piyushj

ответ

2

Самого простой способ сделать это, чтобы иметь одну глобальные переменную count и вы приращение этого переменный каждый раз, когда у вас есть сравнение в коде слияния. Либо это, либо с помощью указателей.

В C, когда вы передаете аргумент функции, этот аргумент копируется, поэтому оригинал останется неизменным. Это проблема с вашим кодом.

Пожалуйста, читайте здесь: Why would I pass function parameters by value in C?