C 插入排序函数的计数和交换

C count and swap for an insertion sort function

我想知道我是否可以得到一些关于这里出了什么问题的指示。 我试图让这个插入排序打印出交换和比较的数量。 我得到要打印的数组,但交换和比较 return 为零。 我不想更改代码的结构只是为了解决问题 我也会尝试计算编译时间,但我想自己做 我感觉到问题出在 Void

#include <math.h> 
#include <stdio.h>
void insertionSort(float array[], int n, int comp, int swap); 
void printArray(float array[], int n, int comp, int swap);

int main()
{
    float array[] ={9.2289,
   7.9052,8.0354,7.8184,7.2325,6.4513,5.5182,5.0191,4.6936,,4.4332};

    int n =sizeof(array) / sizeof (array[0]);
    int x;
    int y;
    
    insertionSort(array, n, x, y);
    printArray(array,n, x,y);
  
    return 0;
}

void insertionSort(float array[], int n,  int comp,  int swap){
    int i, j,k, l;
    float element;
    for (i=1; i < n ; i++ ){
        element=array[i];
        j=i -1;
        comp++;
        while (j>= 0 && array[j] > element){
            array[j+1] = array[j];
            j=j-1;
            comp++;
        }
        array[j + 1]= element;
        l++;
      
        l==swap;
      
    }
  

}
void printArray(float array[], int n, int comp, int swap){
    int i;
    for (i=0; i <n; i++){
        printf ("%f ", array[i]);
        
    }
    printf("swaps = %d", swap);
    printf("comps = %d", comp);
}

解决您的问题

原因是您将值 xy 传递给 printArray 函数,自从您之前几行声明它们以来它们没有改变。在 C 中,变量按值传递,而数组按引用传递。这意味着当您将一个变量(int、float 等)传递给一个函数时,它实际上并没有接收到该变量,而是接收了它的一个副本。因此,当您在 insertionSort 函数中更改 compswap 的值时,它实际上并没有更改 xy 的值,它只是更改该函数自己的副本。因此,当您随后将这些值传递给 printArray 函数时,它会接收(并打印)xy 的原始值,因为您的 insertionSort 函数没有实际上改变他们。您可以通过几种方式解决此问题:

  • 将指向 xy 的指针传递给您的 insertionSort 函数
  • 制作xy全局变量
  • 让您的 insertionSort 函数调用 print 函数(就可扩展性而言,这可能不是一个好的解决方案,因为您可能想在程序的其他地方使用这些值)

这里的第二个问题是您已经声明了 xy,但没有初始化它们(您已经告诉您的程序它们存在,但没有给它们赋值)。当您在 C 中执行此操作时,这些变量最终将在其中包含垃圾值(声明变量时该内存位置中的任何内容)。因此,您的函数以 compswap 都是随机值开始。这可以通过将 int x 行更改为 int x = 0 来轻松解决,对于 y.

也是如此

您似乎也没有在任何地方递增 swap,因此除了 0(或者,在这种情况下,它开始时是垃圾值)之外,它不可能是任何其他值。也许这就是您尝试对变量 l 执行的操作,但您从未将 swap 设置为 l,因此 swap 实际上不会发生任何事情。这可能就是您尝试对行 l==swap; 执行的操作。但是,该行实际上并没有做任何事情。这就是所谓的布尔表达式,本质上意味着它是一个问题:“l 等于 swap 吗?”如果你想实际设置 swapl,你会使用 swap = l;。但这可能不是您想要做的。无论如何,一旦你解决了我已经提到的问题,你将不得不实际增加 swap.

一些其他的事情

  1. 我不确定 k 变量在您的 insertionSort 函数中的用途。您声明了它,但随后不对其进行任何操作。
  2. 你可能会考虑一些更符合逻辑的变量名,只是为了代码的可读性。例如,对于数组的长度,您可以使用 n 而不是 n,并且可能还会考虑 xy.
  3. 的不同名称
  4. 当我复制和粘贴这个时,它一开始没有编译,只是因为一个错字:你的数组初始化中有一个额外的逗号。所以如果你的程序没有编译,这就是原因。

如果有任何不清楚的地方(或者如果您不知道指针是什么),请发表评论,我很乐意编辑以澄清。

编辑

我刚刚在测试时意识到的事情:如果你将指针传递给你的 insertionSort 函数,使用 *comp++ 实际上会增加内存中的地址,而不是值,这会严重地把事情搞砸,所以如果你决定这样做,你要么必须做 (*comp)++ 要么 *comp += 1.