我练习从左到右对数组进行排序 在左侧将有奇数,在右侧甚至是数字。
函数获取(数组)及其大小(n),需要在O(N)上运行。
在上一次比较" 4"到" -3"它本来应该进入第一个,但它不能由于某些原因我无法理解。
感谢您的帮助!
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++;
}
}
答案 0 :(得分:1)
您有一些语法问题,例如:
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 % 2 == 1
时,检查数字是否均匀
如果数字为负数,则为number % 2 == -1
。因为-3
是否定的,
比较失败,代码假定-3
是偶数且无法获得
与4
交换。在这种情况下,我会使用number % 2 != 0
来检查是否
number
很奇怪。
另一种检查数字是否均匀的方法是(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
答案 1 :(得分:0)
-3%2给-1而不是1;有一个((arr [n - 1 + LSB])%2 == 0))它应该是((arr [n - 1 + LSB])%2 == 1));迭代次数不能为n,或者你要交换已经交换过的夫妻:你应该测试MSB + LSB&lt; N;当数字没问题时你应该增加LSB和MSB,交换后也一样; ...
这是一个似乎正在运作的版本。我真诚地怀疑有人使之前的代码工作原样:)
https://onlinegdb.com/HkhLcDJuM
#include <iostream>
using namespace std;
void sort(int *arr, int n);
int main()
{
int n = 10, arr[] = { 6,-10,11,4,-3,21,40,16,-2,7 };
sort(arr, n);
for(int i=0;i<n;i++) {
cout<<arr[i];
cout<<" ";
}
return 0;
}
void sort(int *arr, int n)
{
int temp, i, MSB = 0, LSB = 0;
cout<<"START ";
for(int i=0;i<n;i++) {
cout<<arr[i];
cout<<" ";
}
cout<<" | ";
cout<<MSB;
cout<<" ... ";
cout<<LSB;
cout<<"\n";
while (MSB-LSB<n) {
if (((arr[MSB]) % 2 == 0) && ((arr[n - 1 + LSB]) % 2) != 0) {
temp = arr[MSB];
arr[MSB] = arr[n - 1 + LSB];
arr[n - 1 + LSB] = temp;
MSB++;
LSB--;
} else if (((arr[MSB] % 2) == 0) && (((arr[n - 1 + LSB]) % 2) == 0)) {
LSB--;
} else if (((arr[MSB] % 2) != 0) && (((arr[n - 1 + LSB]) % 2) != 0)) {
MSB++;
} else {
MSB++;
LSB--;
}
for(int i=0;i<n;i++) {
cout<<arr[i];
cout<<" ";
}
cout<<" | ";
cout<<MSB;
cout<<" ... ";
cout<<LSB;
cout<<"\n";
}
}