Дана матрица 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. Сортировка положительных элементов по убыванию, остальных - по возрастанию. Нули в конце»
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;
- }
Объяснение кода листинга программы
В этом коде реализована сортировка с перестановкой для матрицы. Список действий:
- Ввод и заполнение матрицы:
- Матрица NUM x NUM инициализируется нулями.
- Каждый элемент матрицы заполняется случайным числом от -5 до 5.
- Сортировка элементов:
- Используется функция part_bsort для сортировки каждого подмассива матрицы.
- Сначала сортируются положительные числа в порядке убывания, затем отрицательные числа в порядке возрастания.
- Функция part_bsort использует алгоритм сортировки с перестановкой.
- Вывод отсортированной матрицы:
- Отсортированная матрица выводится на экран построчно с помощью функции printf.
- Реализация сортировки с перестановкой:
- Функция part_bsort сортирует подмассив, начиная с первого элемента, который помещается в начало подмассива.
- Затем, используя функцию val_swap, элементы, которые должны быть перед текущим элементом, перемещаются перед ним.
- Эта операция повторяется до тех пор, пока не будет достигнут конец подмассива.
- В конце, если текущий элемент меньше следующего, они меняются местами.
- Эта операция повторяется до тех пор, пока не будет достигнут конец подмассива.
- Таким образом, подмассив сортируется в два прохода: сначала положительные числа в порядке убывания, затем отрицательные числа в порядке возрастания.
- Реализация функции val_swap:
- Функция val_swap меняет местами два элемента массива.
- Это делается путем копирования значения первого элемента во временную переменную, затем копирования значения второго элемента в первый элемент, и, наконец, копирования значения временной переменной во второй элемент.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д