Сортировка строк двумерного массива по первым их элементам - 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;
- }
- }
Объяснение кода листинга программы
- В функции объявлен параметр
n
, который представляет собой количество строк в двумерном массиве. - Внутри функции объявлена переменная
t
типа int* (указатель на целочисленный массив), которая инициализируется значением NULL. Эта переменная будет использоваться для временного хранения значения. - Также внутри функции объявлена переменная
i
типа int, которая инициализируется значением 0 и используется в качестве счетчика для прохода по массиву. - Далее, внутри цикла
for
происходит второй циклfor
, который начинается с i+1, потому что в первом циклеfor
мы уже проверили первую строку. - Внутри второго цикла
for
проверяется условие, что первый элемент текущей строки больше первого элемента следующей строки. Если это условие выполняется, то происходит обмен значениями строк. - Для обмена значениями строк используется временная переменная
t
, которая сохраняет значение первой строки, затем первая строка присваивается значение второй строки, а вторая строка присваивается значениеt
(т.е. первоначальное значение первой строки). - После завершения второго цикла
for
, происходит выход из функции. - В результате выполнения функции, строки в массиве
A
будут отсортированы по первому элементу каждой строки.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д