Есть массив 10 на 10, нужно посчитать суму квадратов элементов каждого столбца и отсортировать эти сумы по убыванию методом Шелла

Есть массив 10 на 10, нужно посчитать суму квадратов элементов каждого столбца и отсортировать эти сумы по убыванию методом Шелла Вот пример кода:

#include <iomanip>

int main() 
{
    const size_t Rows = 10;
    const size_t Cols = 10;
    int a[Rows][Cols] = 
    { 
        {  0,  1,  2,  3, },
        {  4,  5,  6,  7, },
        {  8,  9, 10, 11, },
    };      

    long long int sum[Cols];

    for ( size_t col = 0; col < Cols; col++ )
    {
        sum[col] = 0;

        for ( size_t row = 0; row < Rows; row++ )
        {
            sum[col] += a[row][col];
        }
    }

    for ( size_t row= 0; row < Rows; row++ )
    {
        for ( size_t col = 0; col < Cols; col++ )
        {
            std::cout << std::setw( 2 ) << a[row][col] << ' ';
        }
        std::cout << std::endl;
    }

    std::cout << std::endl;

    for ( long long int x : sum ) std::cout << std::setw( 2 ) << x << ' ';
    std::cout << std::endl;

    return 0;
}

Ответы (1 шт):

Автор решения: Павел Ериков
  1. Вам нужно найти сумму квадратов элементов каждого столбца, а почему-то пишите:

    sum[col] += a[row][col];
    

    То есть вы находите просто сумму столбца, а нужно сумму квадратов:

    sum[col] += a[row][col] * (long long int)a[row][col];
    
  2. Насчет сортировки Шелла. Вы даже на начали её писать, хотя в интернете куча информации (ну или целого кода), так что тут я помогу лишь ссылками на источники.

    Идея алгоритма (так же там есть и реализация на разных языках) и реализация алгоритма

    Чтобы мой ответ не попадал под удаление по причине "Это ответ-ссылка (но не спам)", приведу реализацию алгоритма из последнего источника:

    void ShellSort(int n, int mass[])
    {
        int i, j, step;
        int tmp;
        for (step = n / 2; step > 0; step /= 2)
            for (i = step; i < n; i++)
            {
                tmp = mass[i];
                for (j = i; j >= step; j -= step)
                {
                    if (tmp < mass[j - step])
                        mass[j] = mass[j - step];
                    else
                        break;
                }
                mass[j] = tmp;
            }
    }
    

    Только нужно учитывать, что массив у вас типа long long int, а в реализации int

→ Ссылка