【问题标题】:Counting the number of comparisons for merge sort计算归并排序的比较次数
【发布时间】:2016-10-02 01:37:00
【问题描述】:

这是我的合并排序代码。但我需要找出在合并功能期间进行了多少次比较。对于我的代码,计数输出为 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;
}

【问题讨论】:

  • 不要使用&lt;&lt;= 等,而是创建一个命名函数lessThan 并增加该函数内部的计数。
  • C中的函数参数是传值的。这意味着,更改函数内部参数的值不会更改调用者传入的原始变量。因此,count 需要从函数返回或作为指针传入。
  • 保留一个静态变量counter并在mergesort函数中递增它
  • @kaylum 如何将计数作为指针传递?
  • 你也可以让merge()返回它的计数(从0开始计数),然后在mergesort()中做加法。

标签: c mergesort


【解决方案1】:

实现这一点的最简单方法是拥有一个全局变量count,并且每次在 Mergesort 代码中进行比较时都会增加该变量。或者使用指针。

在 C 中,当您将参数传递给函数时,该参数会被复制,因此原始参数将保持不变。这就是你的代码的问题。

请在此处阅读更多信息:Why would I pass function parameters by value in C?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-03
    • 2021-11-03
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 2015-07-09
    相关资源
    最近更新 更多