C编程 - 排序上次迭代不会改变任何内容

时间:2018-02-24 15:38:39

标签: c algorithm sorting

我练习从左到右对数组进行排序 在左侧将有奇数,在右侧甚至是数字。

函数获取(数组)及其大小(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++;
    }
}

2 个答案:

答案 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)
}
  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 % 2 == 1时,检查数字是否均匀 如果数字为负数,则为number % 2 == -1。因为-3是否定的, 比较失败,代码假定-3是偶数且无法获得 与4交换。在这种情况下,我会使用number % 2 != 0来检查是否 number很奇怪。

    另一种检查数字是否均匀的方法是(number&1) == 0和if 做(number&1) == 1时很奇怪,无论是积极的还是积极的,这都会有用 负。这就是我在代码中使用的内容。

  5. #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";
    }

}