Упорядочить строки массива в порядке возрастания количества равных элементов в каждой строке

#c

#c

Вопрос:

Количество строк, столбцов и элементов вводится пользователем.

В C

Например, у меня есть массив:

 1 1 0 3
2 0 0 0
2 3 4 5
3 3 3 3
 

это должно отображаться следующим образом:

 2 3 4 5
1 1 0 3
2 0 0 0
3 3 3 3
 

Прямо сейчас я застрял. Я попытался присвоить каждой строке значение «1», если есть какие-либо равные элементы, затем я хотел суммировать эти числа, основываясь на этом, чтобы упорядочить строки. Я думал о том, чтобы превратить каждую строку в массив, сравнить равные элементы, а затем переставить их, но я не знаю, как это сделать.

Часть кода, которая у меня есть на данный момент:

 for (int i = 0; i < n; i  ) {
    for (int j = 0; j < m; j  ) {
        for (int k = j   1; k < m; k  ) {
            if (tab[i][j] == tab[i][k]) {
                k1  ;
                if (k1 > 1) {
                    k1--;
                }
                printf("a[%d]%dn", i, k1);
            }
        }
    }
}
 

Ответ №1:

Я думаю, вам следует использовать какую-то структуру данных для хранения повторяющегося числа, которое вы найдете в каждой строке, чтобы вы могли обратиться к нему после перебора всей входной матрицы.

Решение могло бы заключаться в создании R x 10 матрицы, где R — количество строк во входной матрице. В каждом столбце вы сохраняете количество повторений для числа с этим индексом в данной строке.

Для вашего ввода вы должны получить что-то вроде этого:

 1 2 0 1 0 0 0 0 0 0
3 0 1 0 0 0 0 0 0 0
0 0 1 1 1 1 0 0 0 0
0 0 0 4 0 0 0 0 0 0
 

На этом этапе вы можете упорядочить строки на основе того, какая строка содержит наибольшее число.

Очевидно, что может быть другое решение, но я думаю, что это концептуально достаточно просто.

Ответ №2:

Это демонстрация. Измените размер массива и выберите подходящий тип данных в соответствии с вашей реальной ситуацией Сначала введите количество строк и столбцов матрицы. Затем идут матричные данные.

 #include<stdio.h>
#include<stdlib.h>
#include<stdint.h>
#include<string.h>
int m,n;
typedef struct Node{
int data[100];
int repTime;
}Node;


int cmp(const void* a,const void* b){
 return ((Node*)a)->repTime >((Node*)b)->repTime;
}
int main(){
        Node num[1000];
        int time[1000];
        memset(num,0,sizeof(num));
        scanf("%d%d",amp;m,amp;n);
        for(int i=0;i<m;i  ){
                for(int j=0;j<n;j  ){
                  int k;
                  scanf("%d",amp;k);
                  num[i].data[j]=k;
                  time[k]  ;
                  if(time[k]>num[i].repTime){
                        num[i].repTime = num[i].data[k];
                  }
                }
        }
    qsort(num,m,sizeof(struct Node),cmp);
        for(int i=0;i<m;i  ){
                for(int j=0;j<n;j  ){
                  printf("%d ",num[i].data[j]);
                }
                printf("n");
        }

        return 0;
}