C 编程 - 对最后一次迭代进行排序不会改变任何东西

标签 c algorithm sorting

我有一个练习,从左到右对数组进行排序 左侧为奇数,右侧为偶数。

该函数获取一个(数组)及其大小 (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)
}
  1. main 应声明为以下之一:

    • int main(void);
    • int main(int argc, char **argv);
    • int main(int argc, char *argv[]);


    void main() 不正确。

  2. 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)
    {
        ...
    }
    
  3. sort 中,您的 for 循环不会对其余代码使用 { ... }, 循环中仅执行第一个 if

  4. 仅当 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/

相关文章:

linux - 使用 setsockopt() 修改 TCP 中的内核结构?

python - 如何将单链表递归元素和转换为迭代解决方案

algorithm - 在图像中查找人员

linux - 在 unix/linux 中按数字排序,其中 "sort -V"不可用

c - rcu_read_locks 的嵌套

c - 指向固定地址的函数指针

c - 从二进制文件中读取 4 字节日期(大端)

algorithm - 如何将算法导出到其他语言?

excel - 排序数据透视表 VBA

javascript - 根据 Angular JS 中对象数组中的数组长度进行排序