C编程 - 排序最后迭代不会更改任何内容



我有一个从左到右对数组进行分类的练习在左侧,将有奇数数字,右侧甚至数字。

该功能获得(数组(及其大小(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++;
    }
}

您有一些语法问题,例如:

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)
    }
    

    这是语法错误。您应该在main之前将sort的声明发表并用半隆结束:

    void sort(int *arr, int n);
    int main(void)
    {
        ...
    }
    
  3. sort中,您的for -loop不使用{ ... }作为代码的其余部分仅在循环中执行第一个if

  4. 检查数字是否与number % 2 == 1进行检查,仅在数字为正数为负,number % 2 == -1。因为-3为负比较失败,该代码假定-3均匀而不会用4交换。在这种情况下,我将使用number % 2 != 0检查是否 number是奇数。

    另一种检查数字是否是通过执行(number&1) == 0以及是否是进行(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 

-3%2给出-1而不是1;有一个((arr [n -1 lsb](%2 == 0((,其中应为((arr [n -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";
    }
}

最新更新