【问题标题】:Sorting 5 arrays in one function在一个函数中对 5 个数组进行排序
【发布时间】:2017-08-28 17:49:07
【问题描述】:

如果我有 5 个数组和一个包含所有 5 个数组的指针数组,并且我需要编写一个函数,仅使用指针数组对每个数组进行排序,我该怎么做?

该函数需要从索引 1 (!) 而不是 0 开始对数组中的每一个进行排序。

int arr1[] = { 3, 9, 6, 7 };
int arr2[] = { 2, 5, 5 };
int arr3[] = { 0 };
int arr4[] = { 1, 6 };
int arr5[] = { 4, 5, 6, 2, 1 };
int * parr[] = { arr1, arr2, arr3, arr4, arr5 };

我知道如何对一个数组进行排序,但是当我尝试以最有效的方式使用指针数组对每个数组进行排序时,我有点迷失了。也许可以选择在一个循环中对每个数组进行排序?因为为每一个数组做一个完整的“for”循环似乎有点奇怪

注意每个数组的第一个元素表示每个数组的大小。例如:arr1[0] 中为 3,因此该数组中索引 0 之后的数字数量为 3 (9,6,7)。

【问题讨论】:

  • void multi_sort(size_t n, int *parr[n]){ for(size_t i = 0; i < n; ++i) single_sort(parr[i]); }
  • 您是否有人为限制只能“以最有效的方式”使用指针数组? IE。不允许创建其他变量?是否允许调用库函数?指向未排序数组 0 的指针可以被覆盖吗?你的经验水平如何? IE。使用循环的提议对您来说是一个新想法吗?简而言之,如果有任何不明显的要求,请说明。你能展示你对一个数组进行排序的代码吗? IE。 “你试过什么?”。
  • edit您的问题显示what you have tried so far。您应该包含您遇到问题的代码的minimal reproducible example,然后我们可以尝试帮助解决具体问题。您还应该阅读How to Ask
  • 预期输出是多少?排序后,您是否希望arr1 包含{3, 6, 7, 9}

标签: c arrays sorting


【解决方案1】:

您可以在循环中为数组parr 的每个元素调用标准C 函数qsort

例如

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

int cmp( const void *a, const void *b )
{
    return ( *( const int * )b < *( const int * )a ) -
           ( *( const int * )a < *( const int * )b );
}          

int main(void) 
{
    int arr1[] = { 3, 9, 6, 7 };
    int arr2[] = { 2, 5, 5 };
    int arr3[] = { 0 };
    int arr4[] = { 1, 6 };
    int arr5[] = { 4, 5, 6, 2, 1 };
    int * parr[] = { arr1, arr2, arr3, arr4, arr5 };

    const size_t N = sizeof( parr ) / sizeof( *parr );

    for ( size_t i = 0; i < N; i++ )
    {
        qsort( parr[i] + 1, parr[i][0], sizeof( int ), cmp );
    }

    for ( size_t i = 0; i < N; i++ )
    {
        for ( size_t j = 0; j < parr[i][0] + 1; j++ )
        {
            printf( "%d ", parr[i][j] );
        }
        putchar( '\n' );
    }

    return 0;
}

程序输出是

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

【讨论】:

  • The function needs to sort every single one of the array starting from the index 1 (!) and not 0. - 你失败了:D
  • @kaldoran 您似乎无法理解所示的演示程序。
  • 我认为你赢了,我重读了代码和问题,我的错。 [顺便说一句,一开始应该只是个玩笑]
猜你喜欢
  • 2016-02-27
  • 1970-01-01
  • 2018-12-23
  • 2013-11-10
  • 1970-01-01
  • 2012-12-07
  • 2018-06-14
  • 2014-09-18
  • 2020-09-27
相关资源
最近更新 更多