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

Узнай цену своей работы

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

Добрый вечер! Дан массив M*N. Необходимо отсортировать ее по строкам так, чтобы вначале шли все положительные элементы, отсортированные по убыванию, а затем все остальные, отсортированные по возрастанию (если в строке имеются нули - переставить их в конец строки). Вывести получившуюся матрицу. У меня проблема с перестановкой нулей.
Листинг программы
  1. #include <stdio.h>
  2.  
  3. int main()
  4.  
  5. { int N, M,t, i,j,k, mas[10][10]={0}, q;
  6.  
  7. printf("VVEDITE N,M \n");
  8. scanf("%d%d", &N,&M);
  9. printf("VVEDITE MASSIV \n");
  10.  
  11. for (i=0; i < N; i++)
  12. for (j=0; j < M; j++)
  13. scanf ("%d", &mas[i][j]);
  14.  
  15. for(k = 0; k < N; k++){
  16. for(i = 0 ; i < M; i++){
  17. for(j = i + 1; j < M; j++){
  18. if((mas[k][i] < mas[k][j]) && (mas[k][i]!=0)){
  19. t = mas[k][i];
  20. mas[k][i] = mas[k][j];
  21. mas[k][j] = t;
  22. }
  23. }
  24. }
  25. }
  26. if (mas[i][j]<0) {
  27. }
  28. { for(k = 0; k < N; k++){
  29. for(i = 0 ; i < M; i++){
  30. for(j = i + 1; j < M; j++){
  31. if(mas[k][i] < mas[k][j]) {
  32. t = mas[k][i];
  33. mas[k][i] = mas[k][j];
  34. mas[k][j] = t;
  35. }
  36. }
  37. }
  38. }
  39. }
  40. for(i = 0 ; i < M; i++)
  41. {
  42. for(j = 0; j < M; j++)
  43. if (mas[i][j]==0)
  44. {
  45. for ( q = j; q < N-1 ; q++)
  46. {
  47. mas[i][q] = mas[i][q + 1];
  48. }
  49. mas[N-1][M-1] = 0;
  50. }
  51. }
  52. for (i=0; i < N; i++)
  53. {for (j=0; j < M; j++)
  54. printf ("%d\t", mas[i][j]);
  55. printf (" \n");}
  56. getch();}

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

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define NUM 10
  4. int* part_bsort(int* a, int* b, int (*isval)(int), int (*cmp)(int,int));
  5. void val_swap(int* a, int *b);
  6.  
  7. int val_uns(int n) { return (n > 0); }
  8. int val_sig(int n) { return (n < 0); }
  9.  
  10. int cmp_desc(int a, int b)  { return (a > b); }
  11. int cmp_asc(int a, int b) { return (a < b); }
  12.  
  13. int main(void){
  14.     int i, j, *m, mas[NUM][NUM];
  15.  
  16.     //для примера заполним случайными числами
  17.     for(i = 0; i < NUM; ++i){
  18.         for(j = 0; j < NUM; ++j)
  19.             mas[i][j] = -5 + rand() % 11;
  20.     }
  21.  
  22.     //сортируем по заданию
  23.     for(i = 0; i < NUM; ++i){
  24.         m = part_bsort(mas[i], mas[i] + NUM, &val_uns, &cmp_desc);
  25.         part_bsort(m, mas[i] + NUM, &val_sig, &cmp_asc);
  26.     }
  27.  
  28.     //вывод
  29.     for(i = 0; i < NUM; ++i){
  30.         for(j = 0; j < NUM; ++j)
  31.             printf("% d ", mas[i][j]);
  32.         putchar('\n');
  33.     }
  34.     getchar();
  35.     return 0;
  36. }
  37.  
  38. //сортировка с перестановкой
  39. int* part_bsort(int* a, int* b, int (*isval)(int), int (*cmp)(int,int)){
  40.     int* i, *p = a, *o = a;
  41.     for(; a < b; ++a){
  42.         if((*isval)(*a)){
  43.             for(i = a; i > p; --i)
  44.                 val_swap(i, i - 1);
  45.  
  46.             for(i = p; i > o; --i){
  47.                 if((*cmp)(*i, *(i - 1)))
  48.                     val_swap(i, i - 1);
  49.             }
  50.             ++p;   
  51.         }
  52.     }
  53.     return p;
  54. }
  55.  
  56. void val_swap(int* a, int *b){
  57.     int t = *a;
  58.     *a = *b;
  59.     *b = t;
  60. }

Объяснение кода листинга программы

В этом коде реализована сортировка с перестановкой для матрицы. Список действий:

  1. Ввод и заполнение матрицы:
    • Матрица NUM x NUM инициализируется нулями.
    • Каждый элемент матрицы заполняется случайным числом от -5 до 5.
  2. Сортировка элементов:
    • Используется функция part_bsort для сортировки каждого подмассива матрицы.
    • Сначала сортируются положительные числа в порядке убывания, затем отрицательные числа в порядке возрастания.
    • Функция part_bsort использует алгоритм сортировки с перестановкой.
  3. Вывод отсортированной матрицы:
    • Отсортированная матрица выводится на экран построчно с помощью функции printf.
  4. Реализация сортировки с перестановкой:
    • Функция part_bsort сортирует подмассив, начиная с первого элемента, который помещается в начало подмассива.
    • Затем, используя функцию val_swap, элементы, которые должны быть перед текущим элементом, перемещаются перед ним.
    • Эта операция повторяется до тех пор, пока не будет достигнут конец подмассива.
    • В конце, если текущий элемент меньше следующего, они меняются местами.
    • Эта операция повторяется до тех пор, пока не будет достигнут конец подмассива.
    • Таким образом, подмассив сортируется в два прохода: сначала положительные числа в порядке убывания, затем отрицательные числа в порядке возрастания.
  5. Реализация функции val_swap:
    • Функция val_swap меняет местами два элемента массива.
    • Это делается путем копирования значения первого элемента во временную переменную, затем копирования значения второго элемента в первый элемент, и, наконец, копирования значения временной переменной во второй элемент.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы