C语言 以特定方式对数组排序[已关闭]

n3ipq98p  于 2023-01-25  发布在  其他
关注(0)|答案(1)|浏览(122)

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
4小时前关门了。
Improve this question
用C语言编写一个高效的函数,该函数接收一个自然数数组A,其个数为n。该函数必须如下重新排列数组A
在左边的部分,所有的偶数将按升序排序,而在右边的部分,所有的奇数将按降序排序。
函数必须按n·log(n)的顺序运行。
禁止使用辅助数组,但我们可以使用以下函数:
快速排序,二进制搜索,分区,合并排序..
例如:
A={6, 8, 8, 10, 20, 5,1}:函数A={ 1, 20, 5, 6, 8, 8, 10 }将重新排列数组
我试着用快速排序对整个数组进行排序,然后遍历所有元素,把偶数放在第一位,然后计算有多少个偶数,然后,在它试着把奇数放在第二位之后,用evencounter开始,试着按降序排序。
复杂度应该是n·log(n),所以我不知道遍历所有元素是否正确。

bnlyeluc

bnlyeluc1#

我认为使用标准的C函数qsort就足够了。
这是一个演示程序。

#include <stdio.h>
#include <stdlib.h>

int cmp_numbers( const void *a, const void *b )
{
    unsigned int x = *( const unsigned int * )a;
    unsigned int y = *( const unsigned int * )b;

    int result = ( int )( x % 2 ) - ( int )( y % 2 );

    if (result == 0)
    {
        enum { Even = 0, Odd = 1 };

        switch (x % 2)
        {
        case Even:
            return ( y < x ) - ( x < y );
        case Odd:
            return ( x < y ) - ( y < x );
        }
    }
    else
    {
        return result;
    }
}

int main( void )
{
    unsigned int a[] = { 8, 1, 6, 3,  4, 5, 2, 7, 0,  9 };
    const size_t N = sizeof( a ) / sizeof( *a );

    for (size_t i = 0; i < N; i++)
    {
        printf( "%u ", a[i] );
    }
    putchar( '\n' );

    qsort( a, N, sizeof( *a ), cmp_numbers );

    for (size_t i = 0; i < N; i++)
    {
        printf( "%u ", a[i] );
    }
    putchar( '\n' );
}

程序输出为

8 1 6 3 4 5 2 7 0 9
0 2 4 6 8 9 7 5 3 1

否则,您可以编写一个函数,将数组拆分为两个分区,并分别对分区进行排序。
注意这个孤独的

int result = ( int )( x % 2 ) - ( int )( y % 2 );

如果不强制转换为int,表达式的结果将是unsigned int(x和y的类型),并且永远不能为负。
如果你想拥有一个有符号整数数组,那么除了在这个语句中从无符号整数到整数的其他变化之外,使用标准的C函数abs

int result = abs( x % 2 ) - abs( y % 2 );

相关问题