Сортировка строк двумерного массива по первым их элементам - 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
будут отсортированы по первому элементу каждой строки.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д