Сортировка строк двумерного массива по первым их элементам - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Можете помочь с сортировкой строк по возрастанию по первым их элементам т.е. ПРИМЕР. Дан массив: 3 9 0 -7 -5 -7 8 2 9 6 4 1 0 5 3 11 Должно получится: -5 -7 8 2 0 5 3 11 3 9 0 -7 9 6 4 1 Я написал код,но он немного неверно упорядочивает,он только сортирует первый столбец правильно, а остальные как-то случайно сортируются. Вот мой код(не правильно только в

case 4

, так как там и происходит сортировка массива:
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <time.h>
 
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
 
int main()
{
    setlocale(0, "");
 
    srand(time(NULL));
 
    int height = 0;
    int width = 0;
    int sort;
    int numb = 0;
    int numb2 = 0;
    int t = 0;
    int **a = NULL;
 
    a = new int * [height];
                
    for ( int i = 0; i < height; i ++ )
    {
        a[i] = new int [width];
    }
 
    printf("Программа сортировки строк двухмерного динамического массива по возрастанию\n\n");
 
    do
    {
        fflush(stdin);
        printf("1. Задать размерность двухмерного массива\n");
        printf("2. Выбор заполнения массива\n");
        printf("3. Вывод необработанного массива\n");
        printf("4. Обработка массива\n");
        printf("5. Вывод обработанного массива на экран\n");
        printf("0. Выход и программы\n");
        scanf_s("%d", &numb);
        system("cls");
 
        switch(numb)
        {
        case 1:
            {
                for ( int i = 0; i < height; i ++ )
                {
                    delete [] a[i];
                }
                delete [] a;
 
                height = 0;
                width = 0;
 
                do
                {       
                    fflush(stdin);
                    printf("Введите размерность массива: ");
                    printf("\nШирина:> ");
                    scanf_s("%d", &width);
                    printf("Высота:> ");
                    scanf_s("%d", &height);
                    system("cls");
                }
                while ( height <= 0 || width <= 0);
                
                a = new int * [height];
                
                for ( int i = 0; i < height; i ++ )
                {
                    a[i] = new int [width];
                }
 
                t = 1;
                break;
            }
        case 2:
            {
                if ( t > 0 )
                {
                    do
                    {
                        fflush(stdin);
                        printf("Выберите:\n 1. С клавиатуры\n 2. Рандомно\n");
                        scanf_s("%d", &numb2);
                        system("cls");
                    }
                    while ( numb2 != 1 && numb2 != 2 );
                    
                    switch (numb2)
                    {
                    case 1:
                        {
                            printf("Заполните массив:\n");
 
                            for ( int i = 0; i < height; i ++ )
                            {
                                for( int j = 0; j < width; j ++ )
                                {
                                    printf("Введите элемент %d-ой строчки %d-ого столбца: ", i + 1, j + 1);
                                    scanf_s("%d", &a[i][j]);
                                }
                                system("cls");
                            }
                            break;
                        }
                    case 2:
                        {
                            printf("Массив заполнен рандомно");
                            getchar();
                            getchar();
                            system("cls");
 
                            for ( int i = 0; i < height; i ++ )
                            {
                                for( int j = 0; j < width; j ++ )
                                {
                                    a[i][j] = rand() % 50 - 25;
                                }
                            }
                            break;
                        }
                    }
                    t = 2;
                }
                else
                {
                    printf("Задайте размерность массива\n");
                    getchar();
                    getchar();
                    system("cls");
                }
                break;
            }
        case 3:
            {
                if ( t == 2 )
                {
                    printf("Вот сам массив:\n");
 
                    for ( int i = 0; i < height; i ++ )
                    {
                        for( int j = 0; j < width; j ++ )
                        {
                            printf("%4d", a[i][j]);
                        }
                        printf("\n");
                    }
                    getchar();
                    getchar();
                    system("cls");
                    t = 3;
                    break;
                }
                else
                {
                    printf("Сделайте предыдущий шаг");
                    getchar();
                    getchar();
                    system("cls");
                    break;
                }
                break;
            }
        case 4:
            {
                if ( t == 3 )
                {
                    for ( int j = 0; j < width; j ++ )
                    {
                        for ( int i = 1; i < height; i ++ )
                        {
                            for ( int k = 1; k < height; k ++ )
                            {
                                if ( a[k - 1][i] > a[k][i] )
                                {
                                    sort = a[k - 1][i];
                                    a[k - 1][i] = a[k][i];
                                    a[k][i] = sort;
                                }
                            }
                        }
                    }
                    printf("Массив обработан\n");
                    getchar();
                    getchar();
                    system("cls");
                    t = 4;
                }
                else
                {
                    printf("Сделайте предыдущий шаг");
                    getchar();
                    getchar();
                    system("cls");
                }
                break;
            }
        case 5:
            {
                if ( t == 4 )
                {
                    printf("Вот обработанный массив\n");
 
                    for ( int i = 0; i < height; i ++ )
                    {
                        for( int j = 0; j < width; j ++ )
                        {
                            printf("%4d", a[i][j]);
                        }
                        printf("\n");
                    }
                    getchar();
                    getchar();
                    system("cls");
 
                }
                else
                {
                    printf("Сделаете предыдущие шаги");
                    getchar();
                    getchar();
                    system("cls");
                }
                break;
            }
        }
 
    }
    while ( numb != 0 );
    
    for ( int i = 0; i < height; i ++ )
    {
        delete [] a[i];
    }
    
    delete [] a;
 
    _CrtDumpMemoryLeaks();
    return 0;
}

Решение задачи: «Сортировка строк двумерного массива по первым их элементам»

textual
Листинг программы
void sort(int** A, int n)
{
   int* t = NULL, i = 0, j;
   for(;i < n;++i)
     for(j=i+1;j < n;++j)
        if(A[i][0] > A[j][0])
        {
           t = A[i];
           A[i] = A[j];
           A[j] = t;
        }
}

Объяснение кода листинга программы

  1. В функции объявлен параметр n, который представляет собой количество строк в двумерном массиве.
  2. Внутри функции объявлена переменная t типа int* (указатель на целочисленный массив), которая инициализируется значением NULL. Эта переменная будет использоваться для временного хранения значения.
  3. Также внутри функции объявлена переменная i типа int, которая инициализируется значением 0 и используется в качестве счетчика для прохода по массиву.
  4. Далее, внутри цикла for происходит второй цикл for, который начинается с i+1, потому что в первом цикле for мы уже проверили первую строку.
  5. Внутри второго цикла for проверяется условие, что первый элемент текущей строки больше первого элемента следующей строки. Если это условие выполняется, то происходит обмен значениями строк.
  6. Для обмена значениями строк используется временная переменная t, которая сохраняет значение первой строки, затем первая строка присваивается значение второй строки, а вторая строка присваивается значение t (т.е. первоначальное значение первой строки).
  7. После завершения второго цикла for, происходит выход из функции.
  8. В результате выполнения функции, строки в массиве A будут отсортированы по первому элементу каждой строки.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4 из 5
Похожие ответы