我有一个全局整数指针数组,以这种方式创建
int * array;
array = (int *) malloc(size * sizeof(int));
我还有一个排序算法,它应该排序4个大小大于4的数组的第一个数字(在这种情况下为16)。在这种情况下,sizeOfArray定义为4:
int temp,i,j;
for(i=0;i<sizeOfArray;i++){
for(j=i;j<sizeOfArray;j++){
if(array[i] > array[j]){
temp=array[i];
array[i]=array[j];
array[j]=temp;
}
}
}
出于某种原因输出真的很奇怪:
Unsorted: 7,6,9,3
Sorted: 3,6,5,1
最奇怪的部分是如果我改变算法以降序排序数字,它似乎有效:
if(array[i] < array[j])
Unsorted: 10,0,1,8
Sorted: 10,8,1,0
造成这种情况的原因是什么?我完全迷失了。
答案 0 :(得分:2)
以下代码包装为制作MCVE How to create a Minimal, Complete, Valid Example?:
#include <stdio.h>
#include <stdlib.h>
static void print(int n, int a[n])
{
for (int i = 0; i < n; i++)
printf("%2d", a[i]);
putchar('\n');
}
int main(void)
{
int size = 16;
int *array = (int *) malloc(size * sizeof(int));
array[0] = 7;
array[1] = 6;
array[2] = 9;
array[3] = 3;
int sizeOfArray = 4;
printf("Before:");
print(sizeOfArray, array);
int temp, i, j;
for (i = 0; i < sizeOfArray; i++)
{
for (j = i; j < sizeOfArray; j++)
{
if (array[i] > array[j])
{
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
printf("After: ");
print(sizeOfArray, array);
return 0;
}
该程序的输出是:
Before: 7 6 9 3
After: 3 6 7 9
由于这与您获得的输出不同,因此必须存在差异 - 这是一个至关重要的区别。由于您没有显示初始化数组的代码,也没有显示演示前4个元素具有未排序值的代码,也没有显示演示排序值的代码是不可靠的,因此无法确定是错的 - 但问题不在你展示的代码中。
我没有修复代码来检查内存分配是否成功;我也没有修改代码来释放分配的空间。两者都应该完成。
代码确实使用C99功能;修改它是不容易的:
static void print(int n, int *a)
{
int i;
for (i = 0; i < n; i++)
并在分配前移动sizeOfArray
的定义。
答案 1 :(得分:0)
让我们使用您提供的值对代码进行一些迭代:7,6,9,3
。另外,我们假设sizeOfArray = 4
。
对于i = j
,您的条件永远不会被执行,因为array[i] = array[j]
。
i = 0
和j = 1
=&gt; 7 > 6
=&gt; array = {6, 7, 9, 3}
对于i = 0
和j = 2
=&gt; 6 < 9
=&gt; array = {6, 7, 9, 3}
对于i = 0
和j = 3
=&gt; 6 > 3
=&gt; array = {3, 7, 9, 6}
i = 1
和j = 2
=&gt; 7 < 9
=&gt; array = {3, 7, 9, 6}
对于i = 1
和j = 3
=&gt; 7 > 6
=&gt; array = {3, 6, 9, 7}
i = 2
和j = 3
=&gt; 9 > 7
=&gt; array = {3, 6, 7, 9}
因此,我获得了正确排序的数组的四个第一个元素(包含size
元素,我假设size = 16
)。
如果您不确定sizeOfArray
或size
的价值,我建议您打印它们,并检查它是否真的是您想要的价值。
希望这会对你有所帮助。
答案 2 :(得分:0)
我相信这对你的排序数组有用......在第二次迭代中,sizeofarray-1适用于循环j ...
int temp,i,j;
for(i=0;i<sizeOfArray;i++)
{
for(j=0;j<sizeOfArray-1;j++)
{
if(array[i] > array[j])
{
temp=array[i];
array[i]=array[j];
array[j]=temp;
}
}
}