将指针数组排序为整数

时间:2016-04-01 10:59:26

标签: c++ c sorting pointers multidimensional-array

pointersArray

我想在3697 251 0 16 256 中排序每个数组(每个数组的大小是第一个单元格+ 1),而不对第一个单元格进行排序。以上是我的非工作代码,修复它的任何想法?

输出:

3679
215
0
16
41256

预期产出:

NumSet::NumSet()
{
    srand(time(0));
    for (int i = 0; i < C_NUM; i++) {//Generate 2 random arrays.
        n_cards[i] = (rand() % 10) + 1;
    }
}

1 个答案:

答案 0 :(得分:2)

你在这里。

#include <stdio.h>

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

    int * pointersArray[] = { arr1, arr2, arr3, arr4, arr5 };   
    const size_t N = sizeof( pointersArray ) / sizeof( *pointersArray );

    for ( size_t k = 0; k < N; ++k )
    {
        size_t n = *pointersArray[k];

        for ( size_t i = 0; i < n; i++ )
        {
            for ( size_t j = 1; j < n - i; j++ )
            {
                if ( pointersArray[k][j+1] < pointersArray[k][j] )
                {
                    int tmp = pointersArray[k][j+1];
                    pointersArray[k][j+1]  = pointersArray[k][j];
                    pointersArray[k][j] = tmp;
                }
            }
        }
    }

    for ( size_t k = 0; k < N; ++k )
    {
        size_t n = *pointersArray[k] + 1;
        for ( size_t i = 0; i < n; i++ ) printf( "%d ", pointersArray[k][i] );
        printf( "\n" );
    }        

}

程序输出

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

考虑到它会更简单,如果您使用标准C函数qsort而不是手动编写冒泡排序函数,代码会更清晰。

例如

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

int cmp( const void *lhs, const void *rhs )
{
    int a = *( int * )lhs;
    int b = *( int * )rhs;

    return ( b < a ) - ( a < b );
}

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

    int * pointersArray[] = { arr1, arr2, arr3, arr4, arr5 };   
    const size_t N = sizeof( pointersArray ) / sizeof( *pointersArray );

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

    for ( size_t k = 0; k < N; ++k )
    {
        size_t n = *pointersArray[k] + 1;
        for ( size_t i = 0; i < n; i++ ) printf( "%d ", pointersArray[k][i] );
        printf( "\n" );
    }        

}

输出与上面显示的相同

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

在C ++中,您可以使用标头std::sort中声明的标准算法<algorithm>。 例如

#include <iostream>
#include <algorithm>

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

    int * pointersArray[] = { arr1, arr2, arr3, arr4, arr5 };   

    for ( auto p : pointersArray )
    {
        std::sort( p + 1, p + 1 + *p ); 
    }

    for ( auto p : pointersArray )
    {
        size_t n = *p + 1;
        for ( size_t i = 0; i < n; i++ ) std::cout << p[i] << ' ';
        std::cout << std::endl;
    }        

}

输出

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