#c #sorting #multidimensional-array #insertion-sort #function-definition
#c #сортировка #многомерный массив #вставка-сортировка #функция-определение
Вопрос:
У меня есть задача на моем уроке программирования — отсортировать нечетные строки 2D-массива в порядке возрастания, используя метод сортировки вставки, используя указатель. До сих пор я пробовал без указателя, потому что я не знаю, как это сделать. Вот код, который я создал, и он работает не так, как должен.
#include<stdio.h>
main(){
int i,j,n,m;
printf("Introduce n=");
scanf("%d",amp;n);
printf("Introduce m=");
scanf("%d",amp;m);
int a[n][m];
for(i=0; i<n; i ){
for(j=0; j<m; j ){
printf("a[%d][%d]=",i,j);
scanf("%d",amp;a[i][j]);
}
}
for(i=1; i<n ; i )
{
for(j=1; j<n; j )
{
if(i%2==1)
{
for( j = 1 ; j < m ; j )
{
int p = j;
while(p > 0 amp;amp; a[i][p] < a[i][p-1])
{
int aux = a[i][p];
a[i][p] = a[i][p-1];
a[i][p-1] = aux;
p --;
}
}
}
}
}
for(i=0; i<n; i ){
for(j=0; j<m; j ){
printf("a[%d][%d]=%d",i,j,a[i][j]);
}
}
return 0;
}
Комментарии:
1. Вы могли бы просто увеличить i на 2 вместо проверки, является ли i нечетным на каждой итерации
Ответ №1:
Это непростая задача для новичков, таких как вы и я. Более того, неясно, что означают эти слова «с использованием указателя».
Я могу предложить следующее решение, показанное в демонстрационной программе ниже. То есть есть отдельная функция, которая выполняет сортировку с использованием параметров, имеющих типы указателей на массивы переменной длины.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
void sort_by_odd_rows( size_t n,
int ( *first )[n],
int ( *last )[n],
int cmp( const int *, const int *, size_t ) )
{
if ( first != last amp;amp; first != last )
{
for ( int ( *next )[n] = first; next != last amp;amp; next != last; )
{
int tmp[n];
memcpy( tmp, *next, n * sizeof( int ) );
int ( *current )[n] = next;
while ( current != first amp;amp; cmp( tmp, *( current - 2 ), n ) < 0 )
{
memcpy( *current, *( current - 2 ), n * sizeof( int ) );
current -= 2;
}
if ( current != next )
{
memcpy( *current, tmp, n * sizeof( int ) );
}
}
}
}
int cmp( const int *a, const int *b, size_t n )
{
size_t i = 0;
while ( i < n amp;amp; a[i] == b[i] ) i;
return i == n ? 0 : ( b[i] < a[i] ) - ( a[i] < b[i] );
}
int main(void)
{
size_t m = 10, n = 5;
int a[m][n];
srand( ( unsigned int )time( NULL ) );
for ( size_t i = 0; i < m; i )
{
for ( size_t j = 0; j < n; j )
{
a[i][j] = rand() % ( m * n );
}
}
for ( size_t i = 0; i < m; i )
{
for ( size_t j = 0; j < n; j )
{
printf( "- ", a[i][j] );
}
putchar( 'n' );
}
putchar( 'n' );
sort_by_odd_rows( n, a, a m, cmp );
for ( size_t i = 0; i < m; i )
{
for ( size_t j = 0; j < n; j )
{
printf( "- ", a[i][j] );
}
putchar( 'n' );
}
putchar( 'n' );
return 0;
}
Вывод программы может выглядеть следующим образом
22 8 2 10 5
33 21 20 17 45
7 20 3 7 5
47 31 21 29 39
46 44 0 31 7
37 43 8 43 23
6 15 32 8 25
39 41 49 9 8
44 18 30 49 27
35 46 9 7 28
22 8 2 10 5
33 21 20 17 45
7 20 3 7 5
35 46 9 7 28
46 44 0 31 7
37 43 8 43 23
6 15 32 8 25
39 41 49 9 8
44 18 30 49 27
47 31 21 29 39
Как видно из выходных данных, нечетные строки массива сортируются в порядке возрастания. Первыми элементами нечетных строк после сортировки являются 33, 35,37, 39, 47.
Что касается вашего кода, то он не имеет большого смысла. Например, в этих двух циклах for
for(j=1; j<n; j )
{
if(i%2==1)
{
for( j = 1 ; j < m ; j )
//...
вы используете ту же переменную j
.
РЕДАКТИРОВАТЬ: кажется, я неправильно понял ваше назначение, и вам нужно отсортировать элементы в каждой нечетной строке в порядке возрастания.
В этом случае функция сортировки будет выглядеть намного проще.
Вот демонстрационная программа.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void insertion_sort( int *a, size_t n )
{
for ( int *first = a, *last = a n; first != last; first )
{
int tmp = *first;
int *current = first;
for ( ; current != a amp;amp; tmp < *( current - 1 ); --current )
{
*current = *( current - 1 );
}
if ( current != first ) *current = tmp;
}
}
int main(void)
{
size_t m = 10, n = 5;
int a[m][n];
srand( ( unsigned int )time( NULL ) );
for ( size_t i = 0; i < m; i )
{
for ( size_t j = 0; j < n; j )
{
a[i][j] = rand() % ( m * n );
}
}
for ( size_t i = 0; i < m; i )
{
for ( size_t j = 0; j < n; j )
{
printf( "- ", a[i][j] );
}
putchar( 'n' );
}
putchar( 'n' );
for ( size_t i = 1; i < m; i = 2 )
{
insertion_sort( *( a i ), n );
}
for ( size_t i = 0; i < m; i )
{
for ( size_t j = 0; j < n; j )
{
printf( "- ", a[i][j] );
}
putchar( 'n' );
}
putchar( 'n' );
return 0;
}
Вывод программы может выглядеть следующим образом
25 32 47 24 10
33 39 32 31 33
46 8 49 35 16
32 34 9 35 22
13 35 45 27 45
17 37 2 13 6
33 40 38 30 14
48 15 6 32 49
39 28 7 39 15
26 23 2 35 8
25 32 47 24 10
31 32 33 33 39
46 8 49 35 16
9 22 32 34 35
13 35 45 27 45
2 6 13 17 37
33 40 38 30 14
6 15 32 48 49
39 28 7 39 15
2 8 23 26 35
Теперь в каждой нечетной строке элементы отсортированы в порядке возрастания.
Комментарии:
1. Это то, что вы называете ответом с дополнительным бонусом, объясняющим, как сортировать как по строкам, так и по столбцам для строк, начинающихся с нечетных значений. Жаль, что я не могу проголосовать дважды…
2. Спасибо! Отличный ответ на мою проблему!