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);
}
解决您的问题
原因是您将值 x
和 y
传递给 printArray
函数,自从您之前几行声明它们以来它们没有改变。在 C 中,变量按值传递,而数组按引用传递。这意味着当您将一个变量(int、float 等)传递给一个函数时,它实际上并没有接收到该变量,而是接收了它的一个副本。因此,当您在 insertionSort
函数中更改 comp
和 swap
的值时,它实际上并没有更改 x
和 y
的值,它只是更改该函数自己的副本。因此,当您随后将这些值传递给 printArray
函数时,它会接收(并打印)x
和 y
的原始值,因为您的 insertionSort
函数没有实际上改变他们。您可以通过几种方式解决此问题:
- 将指向
x
和 y
的指针传递给您的 insertionSort
函数
- 制作
x
和y
全局变量
- 让您的
insertionSort
函数调用 print 函数(就可扩展性而言,这可能不是一个好的解决方案,因为您可能想在程序的其他地方使用这些值)
这里的第二个问题是您已经声明了 x
和 y
,但没有初始化它们(您已经告诉您的程序它们存在,但没有给它们赋值)。当您在 C 中执行此操作时,这些变量最终将在其中包含垃圾值(声明变量时该内存位置中的任何内容)。因此,您的函数以 comp
和 swap
都是随机值开始。这可以通过将 int x
行更改为 int x = 0
来轻松解决,对于 y
.
也是如此
您似乎也没有在任何地方递增 swap
,因此除了 0(或者,在这种情况下,它开始时是垃圾值)之外,它不可能是任何其他值。也许这就是您尝试对变量 l
执行的操作,但您从未将 swap
设置为 l
,因此 swap
实际上不会发生任何事情。这可能就是您尝试对行 l==swap;
执行的操作。但是,该行实际上并没有做任何事情。这就是所谓的布尔表达式,本质上意味着它是一个问题:“l
等于 swap
吗?”如果你想实际设置 swap
到 l
,你会使用 swap = l;
。但这可能不是您想要做的。无论如何,一旦你解决了我已经提到的问题,你将不得不实际增加 swap
.
一些其他的事情
- 我不确定 k 变量在您的
insertionSort
函数中的用途。您声明了它,但随后不对其进行任何操作。
- 你可能会考虑一些更符合逻辑的变量名,只是为了代码的可读性。例如,对于数组的长度,您可以使用
n
而不是 n
,并且可能还会考虑 x
和 y
. 的不同名称
- 当我复制和粘贴这个时,它一开始没有编译,只是因为一个错字:你的数组初始化中有一个额外的逗号。所以如果你的程序没有编译,这就是原因。
如果有任何不清楚的地方(或者如果您不知道指针是什么),请发表评论,我很乐意编辑以澄清。
编辑
我刚刚在测试时意识到的事情:如果你将指针传递给你的 insertionSort
函数,使用 *comp++
实际上会增加内存中的地址,而不是值,这会严重地把事情搞砸,所以如果你决定这样做,你要么必须做 (*comp)++
要么 *comp += 1
.
我想知道我是否可以得到一些关于这里出了什么问题的指示。 我试图让这个插入排序打印出交换和比较的数量。 我得到要打印的数组,但交换和比较 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);
}
解决您的问题
原因是您将值 x
和 y
传递给 printArray
函数,自从您之前几行声明它们以来它们没有改变。在 C 中,变量按值传递,而数组按引用传递。这意味着当您将一个变量(int、float 等)传递给一个函数时,它实际上并没有接收到该变量,而是接收了它的一个副本。因此,当您在 insertionSort
函数中更改 comp
和 swap
的值时,它实际上并没有更改 x
和 y
的值,它只是更改该函数自己的副本。因此,当您随后将这些值传递给 printArray
函数时,它会接收(并打印)x
和 y
的原始值,因为您的 insertionSort
函数没有实际上改变他们。您可以通过几种方式解决此问题:
- 将指向
x
和y
的指针传递给您的insertionSort
函数 - 制作
x
和y
全局变量 - 让您的
insertionSort
函数调用 print 函数(就可扩展性而言,这可能不是一个好的解决方案,因为您可能想在程序的其他地方使用这些值)
这里的第二个问题是您已经声明了 x
和 y
,但没有初始化它们(您已经告诉您的程序它们存在,但没有给它们赋值)。当您在 C 中执行此操作时,这些变量最终将在其中包含垃圾值(声明变量时该内存位置中的任何内容)。因此,您的函数以 comp
和 swap
都是随机值开始。这可以通过将 int x
行更改为 int x = 0
来轻松解决,对于 y
.
您似乎也没有在任何地方递增 swap
,因此除了 0(或者,在这种情况下,它开始时是垃圾值)之外,它不可能是任何其他值。也许这就是您尝试对变量 l
执行的操作,但您从未将 swap
设置为 l
,因此 swap
实际上不会发生任何事情。这可能就是您尝试对行 l==swap;
执行的操作。但是,该行实际上并没有做任何事情。这就是所谓的布尔表达式,本质上意味着它是一个问题:“l
等于 swap
吗?”如果你想实际设置 swap
到 l
,你会使用 swap = l;
。但这可能不是您想要做的。无论如何,一旦你解决了我已经提到的问题,你将不得不实际增加 swap
.
一些其他的事情
- 我不确定 k 变量在您的
insertionSort
函数中的用途。您声明了它,但随后不对其进行任何操作。 - 你可能会考虑一些更符合逻辑的变量名,只是为了代码的可读性。例如,对于数组的长度,您可以使用
n
而不是n
,并且可能还会考虑x
和y
. 的不同名称
- 当我复制和粘贴这个时,它一开始没有编译,只是因为一个错字:你的数组初始化中有一个额外的逗号。所以如果你的程序没有编译,这就是原因。
如果有任何不清楚的地方(或者如果您不知道指针是什么),请发表评论,我很乐意编辑以澄清。
编辑
我刚刚在测试时意识到的事情:如果你将指针传递给你的 insertionSort
函数,使用 *comp++
实际上会增加内存中的地址,而不是值,这会严重地把事情搞砸,所以如果你决定这样做,你要么必须做 (*comp)++
要么 *comp += 1
.