我有一个练习,从左到右对数组进行排序 左侧为奇数,右侧为偶数。
该函数获取一个(数组)及其大小 (n),并且需要在 O(N) 上运行。
在最后一个比较“4”和“-3”中,它应该进入第一个 if,但由于某种我无法理解的原因,它没有进入。
感谢您的帮助!
void main()
{
int n = 10, arr[] = { 6,-10,11,4,-3,21,40,16,-2,7 };
sort(arr, n);
}
void sort(int *arr, int n)
{
int temp, i, MSB = 0, LSB = 0;
for (i = 0; i < n ; i++)
if (((arr[MSB]) % 2 == 0) && (arr[n - 1 + LSB]) % 2 == 1)
{
temp = arr[MSB];
arr[MSB] = arr[n - 1 + LSB];
arr[n - 1 + LSB] = temp;
}
if (((arr[MSB] % 2) == 0) && ((arr[n - 1 + LSB]) % 2 == 0))
{
LSB--;
}
if (((arr[MSB] % 2) == 1) && ((arr[n - 1 + LSB]) % 2 == 0))
{
MSB++;
}
}
最佳答案
您有一些语法问题,例如:
void main()
{
int n = 10, arr[] = { 6,-10,11,4,-3,21,40,16,-2,7 };
sort(arr, n);}void sort(int *arr, int n)
}
main
应声明为以下之一:int main(void);
int main(int argc, char **argv);
int main(int argc, char *argv[]);
void main()
不正确。将
void sort
部分移到新行中,您将得到void main() { int n = 10, arr[] = { 6,-10,11,4,-3,21,40,16,-2,7 }; sort(arr, n); } void sort(int *arr, int n) }
这是一个语法错误。您应该将
sort
声明放在main
之前 并以分号结束:void sort(int *arr, int n); int main(void) { ... }
在
sort
中,您的for
循环不会对其余代码使用{ ... }
, 循环中仅执行第一个if
。仅当 number 为偶数时,
number % 2 == 1
检查数字是否为偶数 正数,如果数字为负数,number % 2 == -1
。因为-3
是负数, 比较失败,代码假设-3
是偶数并且没有得到 与4
交换。在这种情况下,我将使用number % 2 != 0
来检查是否数字
是奇数。检查数字是否为偶数的另一种方法是执行
(number&1) == 0
和 if 这样做很奇怪(number&1) == 1
,无论它是正数还是负数,这都会起作用 消极的。这就是我在代码中使用的。
#include <stdio.h>
void sort(int *arr, size_t n);
int main()
{
int arr[] = { 6,-10,11,4,-3,21,40,16,-2,7 };
size_t len = sizeof arr / sizeof *arr;
for(size_t i = 0; i < len; ++i)
printf("%d ", arr[i]);
putchar('\n');
sort(arr, len);
for(size_t i = 0; i < len; ++i)
printf("%d ", arr[i]);
putchar('\n');
return 0;
}
void sort(int *arr, size_t n)
{
int temp, MSB = 0, LSB = 0;
for (size_t i = 0; i < n ; i++)
{
if (((arr[MSB] & 1) == 0) && ((arr[n - 1 + LSB] & 1) == 1))
{
temp = arr[MSB];
arr[MSB] = arr[n - 1 + LSB];
arr[n - 1 + LSB] = temp;
}
if (((arr[MSB] & 1) == 0) && ((arr[n - 1 + LSB] & 1) == 0))
{
LSB--;
}
if (((arr[MSB] & 1) == 1) && ((arr[n - 1 + LSB] & 1) == 0))
{
MSB++;
}
}
}
这给了我这个输出
$ ./a
6 -10 11 4 -3 21 40 16 -2 7
7 21 11 -3 4 -10 40 16 -2 6
关于C 编程 - 对最后一次迭代进行排序不会改变任何东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48964531/