簡體   English   中英

在多維數組中尋找最小的元素

[英]Finding the smallest element in multidimensional array

我再次尋求幫助。 這次,我發現自己處於一項在互聯網上發現的任務之中,找不到理想的解決方案。 起初,我想到了冒泡排序,但似乎沒有找到將其用於多維數組的方法。 該任務要求找到在第二個數組上不重復的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;
}

要查找最小值及其在數組中的位置:

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;
            }
        }
    }

第一次嘗試后,請重復兩次以上,以避免發現最小值。 每個最小值的位置是已知的。

以前,這是一個建議。 現在,這是解決方案:

//----------------------------------------------------------------------------
#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;
}
//-----------------------------------------------------------------------------

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM