Сортировка строк двумерного массива по первым их элементам - 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будут отсортированы по первому элементу каждой строки.