Сортировка по количеству повторяемых элементов - C (СИ)
Формулировка задачи:
Сгенерировать рамдомную матрицу 10*10(используя //randomize()),
отсортировать ее по количеству повторяемих елеvентов в каждой строке.напр.1 строка
0 2 6 4 6 0 4 0 6 5
нужно чтоб бьіло:
6 6 6 0 0 0 4 4 5 2
______________________________
Моих мозгов хватила только на генерацию массива и опредиление количества соответствий\повторений
_________________________________________________________________
//--------------------------------------------------------------------------- #pragma hdrstop //--------------------------------------------------------------------------- #include<stdio.h> #pragma argsused #include<stdlib.h> int main(int argc, char* argv[]) { int i,j,k, mas[10][10],kilkist_spivpadin[10], spivpadin; // randomize(); //генерування масиву for (i=0;i<=9;i++) { kilkist_spivpadin[i]=0; for (j=0;j<=9;j++){ // вивід масиву на екран mas[i][j]=random(7); } } for (i=0;i<=9;i++) { for (j=0;j<=9;j++){ printf("%5d", mas[i][j]); } printf("\n"); } for (i=0;i<=9;i++)//рухаємося по рядочках { for (j=0;j<=9;j++) { spivpadin=1; for (k=j+1;k<=9;k++) { if (mas[i][j]==mas[i][k]) spivpadin++; } if (kilkist_spivpadin[i]<spivpadin ) kilkist_spivpadin[i]=spivpadin; } } for (i=0;i<=9;i++) { printf("\nspivpadin v %d rjadky%5d", i,kilkist_spivpadin[i]); } scanf("%f",i); return 0; } //---------------------------------------------------------------------------
Решение задачи: «Сортировка по количеству повторяемых элементов»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #define N 10 //сортировка по частоте только от 0-9 значений void sort_ihz(int* a, int n){ int i, j, k, c, cs[10], ds[10]; memset(cs, 0, sizeof(cs)); for(i = 0; i < n; ++i){ ++cs[a[i]]; ds[a[i]] = a[i]; } //сортировка вставками for(i = 1; i < 10; ++i){ k = ds[i]; c = cs[i]; j = i - 1; while((j >= 0) && (cs[j] < c)){ cs[j + 1] = cs[j]; ds[j + 1] = ds[j]; --j; } cs[j + 1] = c; ds[j + 1] = k; } for(j = i = 0; i < 10; ++i){ for(k = 0; k < cs[i]; ++k) a[j++] = ds[i]; } } int main(void){ int i, j, m[N][N]; srand((unsigned int)time(NULL)); for(i = 0; i < N; ++i){ for(j = 0; j < N; ++j) m[i][j] = rand() % 10; } for(i = 0; i < N; ++i) sort_ihz(m[i], N); for(i = 0; i < N; ++i){ for(j = 0; j < N; ++j) printf("%d ", m[i][j]); putchar('\n'); } return 0; }
Объяснение кода листинга программы
- Предоставленный код реализует сортировку массива по количеству повторяющихся элементов.
- В начале кода подключаются необходимые библиотеки для работы с массивами, строками, временем и циклом.
- Определяется константа N, которая задает размер массива (в данном случае 10).
- Создаются две функции: sort_ihz и main.
- Функция sort_ihz принимает на вход массив a и его размер n, и выполняет сортировку по количеству повторяющихся элементов.
- Внутри функции sort_ihz создаются массивы cs и ds, которые будут использоваться для подсчета количества повторений и хранения индексов элементов.
- С помощью функции memset обнуляются все элементы массива cs.
- Происходит заполнение массива cs и ds значениями, подсчитывая количество повторений каждого элемента в массиве a.
- Далее происходит сортировка массива ds (по содержанию элементов) с помощью алгоритма сортировки вставками.
- После сортировки элементов по количеству повторений, происходит перестановка элементов массива a в соответствии с полученными результатами.
- В функции main создается массив m размерностью NxN, который заполняется случайными значениями от 0 до 9.
- Затем вызывается функция sort_ihz для каждого подмассива m[i], где i - номер подмассива.
- После сортировки выводится отсортированный подмассив на экран.
- В конце функции main возвращается 0, что означает успешное выполнение программы.