Дана матрица M*N. Сортировка положительных элементов по убыванию, остальных - по возрастанию. Нули в конце - C (СИ)

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

Добрый вечер! Дан массив M*N. Необходимо отсортировать ее по строкам так, чтобы вначале шли все положительные элементы, отсортированные по убыванию, а затем все остальные, отсортированные по возрастанию (если в строке имеются нули - переставить их в конец строки). Вывести получившуюся матрицу. У меня проблема с перестановкой нулей.
#include <stdio.h>
 
 
int main()
 
 
{   int N, M,t, i,j,k, mas[10][10]={0}, q;
 
 
    printf("VVEDITE N,M \n");
    scanf("%d%d", &N,&M);
    printf("VVEDITE MASSIV \n");
 
 
 
for (i=0; i < N; i++)
       for (j=0; j < M; j++)
           scanf ("%d", &mas[i][j]);
 
 
 
for(k = 0; k < N; k++){
    for(i = 0 ; i < M; i++){
        for(j = i + 1; j < M; j++){
 
            if((mas[k][i] < mas[k][j]) && (mas[k][i]!=0)){
 
                    t = mas[k][i];
                    mas[k][i] = mas[k][j];
                    mas[k][j] = t;
 
            }
        }
    }
}
 
if (mas[i][j]<0) {
    
}
{   for(k = 0; k < N; k++){
        for(i = 0 ; i < M; i++){
            for(j = i + 1; j < M; j++){
 
                if(mas[k][i] < mas[k][j]) {
 
                    t = mas[k][i];
                    mas[k][i] = mas[k][j];
                    mas[k][j] = t;
 
            }
        }
    }
}
}
for(i = 0 ; i < M; i++)
    {
        for(j = 0; j < M; j++)
            if (mas[i][j]==0)
        {
                for ( q = j; q < N-1 ; q++)
                {
                    mas[i][q] = mas[i][q + 1];
                }
                mas[N-1][M-1] = 0;
 
        }
    }
 
for (i=0; i < N; i++)
       {for (j=0; j < M; j++)
              printf ("%d\t", mas[i][j]);
       printf (" \n");}
 
getch();}

Код к задаче: «Дана матрица M*N. Сортировка положительных элементов по убыванию, остальных - по возрастанию. Нули в конце - C (СИ)»

textual
#include <stdio.h>
#include <stdlib.h>
#define NUM 10
int* part_bsort(int* a, int* b, int (*isval)(int), int (*cmp)(int,int));
void val_swap(int* a, int *b);
 
int val_uns(int n) { return (n > 0); }
int val_sig(int n) { return (n < 0); }
 
int cmp_desc(int a, int b)  { return (a > b); }
int cmp_asc(int a, int b) { return (a < b); }
 
int main(void){
    int i, j, *m, mas[NUM][NUM];
 
    //для примера заполним случайными числами
    for(i = 0; i < NUM; ++i){
        for(j = 0; j < NUM; ++j)
            mas[i][j] = -5 + rand() % 11;
    }
 
    //сортируем по заданию
    for(i = 0; i < NUM; ++i){
        m = part_bsort(mas[i], mas[i] + NUM, &val_uns, &cmp_desc);
        part_bsort(m, mas[i] + NUM, &val_sig, &cmp_asc);
    }
 
    //вывод
    for(i = 0; i < NUM; ++i){
        for(j = 0; j < NUM; ++j)
            printf("% d ", mas[i][j]);
        putchar('\n');
    }
    getchar();
    return 0;
}
 
//сортировка с перестановкой
int* part_bsort(int* a, int* b, int (*isval)(int), int (*cmp)(int,int)){
    int* i, *p = a, *o = a;
    for(; a < b; ++a){
        if((*isval)(*a)){
            for(i = a; i > p; --i)
                val_swap(i, i - 1);
 
            for(i = p; i > o; --i){
                if((*cmp)(*i, *(i - 1)))
                    val_swap(i, i - 1);
            }
            ++p;    
        }
    }
    return p;
}
 
void val_swap(int* a, int *b){
    int t = *a;
    *a = *b;
    *b = t;
}
Эта работа вам не подошла?

Вы всегда можете заказать любую учебную работу у наших авторов от 20 руб.

6   голосов, оценка 4.167 из 5


СДЕЛАЙТЕ РЕПОСТ