查找多维数组中的最小元素

时间:2015-01-13 20:48:56

标签: c math

我再次寻求帮助。这次我发现自己正处于互联网上发现的任务中,我找不到一个好的解决方案。起初我想到了冒泡排序,但我似乎没有找到一种方法来使用它与多维数组。 该任务要求找到3个在第二个阵列上不重复的最小元素。 到目前为止,我的代码看起来像这样,虽然我删除了很多...因为这是一个非常错误和徒劳的方法。

一切都是用C写的。 谢谢你的帮助。

3

1 2 3

3 3 3

3 3 3

5 4 6

6 4 5

4 5 6

这是文件的给定信息

#include stdio.h
#include stdlib.h

int main()
{
    FILE *fptr;
    fptr = fopen("Duomenys.txt", "r");
    int i, j;
    int k, l;
    int bubbleTmp;
    fscanf(fptr, "%d ", &k);
    l = k;
    int a[k][k];
    int b[k][k];

    for(i = 0; i < k; i++)
    {
        for(j = 0; j < l; j++)
        {
            fscanf(fptr,"%d ",&a[i][j]);
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }

    printf("\n\n\n");

    for(i = 0; i < k; i++)
    {
        for(j = 0; j < l; j++)
        {
            fscanf(fptr,"%d ",&b[i][j]);
            printf("%d ", b[i][j]);
        }
        printf("\n");
    }

    // Bubble Sort
    for(i = 0; i < k; i++)
    {
        for(j = 0; j < l; j++)
        {
            if(a[i][j] > a[i][j+1])
            {

            }
        }
    }


    fclose(fptr);
    return 0;
}

2 个答案:

答案 0 :(得分:0)

要在数组中找到最小值及其位置:

int min = a[0][0], i_min = 0, j_min = 0;

for(i = 0; i < k; i++)
    {
        for(j = 0; j < l; j++)
        {
            if(a[i][j] < min)
            {
                min = a[i][j];
                i_min = i;
                j_min = j;
            }
        }
    }

第一次尝试后,再重复两次,避免发现最低限度的alrerady。每个最小值的位置都是已知的。

答案 1 :(得分:0)

以前,这是一个建议。 现在,这是解决方案:

//----------------------------------------------------------------------------
#include <iostream>
#include <iomanip>
#include <ctime>
//----------------------------------------------------------------------------
int **CreateArray (int N, int M)
{
    int **arr = new int*[N];
    for (int i = 0; i<N; i++)
        arr[i] = new int [M];

    for (int i = 0; i<N; i++)
        for (int j = 0; j<M; j++)
            arr[i][j] = rand()%10 - rand()%10;

    return arr;
}

void DestroyArray (int **arr, int N)
{
    for (int i = 0; i<N; i++)
        delete [] arr[i];
    delete [] arr;
}

void PrintArray (int **arr, int N, int M)
{
    for (int i = 0; i<N; i++)
    {   
        for (int j = 0; j<M; j++)
            std::cout << std::setw(7) << arr[i][j];
        std::cout << "\n";
    }
    std::cout << "\n";
}

//----------------------------------------------------------------------------
typedef struct _min
{
    int value;
    int i;
    int j;
} TMin;

//---------------------------------------------------------------------------
void FindMin (int **arr, int N, int M, TMin **mins, int min_count)
{
    mins[min_count]->value = arr[0][0];
    mins[min_count]->i = 0;
    mins[min_count]->j = 0;

    for (int i = 0; i<N; i++)
        for (int j = 0; j<M; j++)
        {
            if (arr[i][j] < mins[min_count]->value)
            {
                bool prev = false;
                for (int k = 0; k<min_count; k++)
                    if (i == mins[k]->i && j == mins[k]->j)
                    {   
                        prev = true;
                        break;
                    }

                if (!prev)
                {   
                    mins[min_count]->value = arr[i][j];
                    mins[min_count]->i = i;
                    mins[min_count]->j = j;
                }
            }
        }
}
//----------------------------------------------------------------------------
int main()
{   
        //array creation, filling, printing
        srand ((unsigned int)time (NULL));
        int N = 6, M = 7;
        int **arr = CreateArray (N, M);
        PrintArray (arr, N, M);

        //container for 3 minimums
        TMin **mins = new TMin*[3];
            for (int i = 0; i<3; i++)
                mins[i] = new TMin;

        //let us find them
        int min_count = -1;
        while (++min_count < 3)
            FindMin (arr, N, M, mins, min_count);

        //result
        for (int i = 0; i<3; i++)
            std::cout << "arr[" << mins[i]->i << "][" <<mins[i]->j << "] = " << mins[i]->value << "\n";

        //cleaning memory
        for (int i = 0; i<3; i++)
            delete [] mins[i];
        delete [] mins;

        DestroyArray (arr, N);

        std::cin.sync();
        std::cin.get();
        return 0;
}
//-----------------------------------------------------------------------------