Сортировка элементов массива так, что сначала идут все повторяющиеся элементы - C (СИ)
Формулировка задачи:
Привет всем, может кто-то уже сталкивался с такой задачей, вводим элементы массива, на выходе получаем сначала повторяющиеся элементы, а потом те, который идут по порядку.
Вот пример
пробовал делать вложенный цикл с условием, но не вышло, есть какие мысли?
Решение задачи: «Сортировка элементов массива так, что сначала идут все повторяющиеся элементы»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 15 int main() { int arr[N], mask[N] = {0}, res[N] = {0}, i,j, single, cur; int *temp; srand(time(NULL)); //form initial array through randomizing printf("Initial array:\n"); for(i=0;i<N;i++) { arr[i] = rand()%12+1; printf("%3d",arr[i]); } //form mask-array: 0 - unique element // 1 - there are copies but they already counted // >1 - count of copies for this element for(i=0;i<N;i++) { for(j=i+1;j<N;j++) if(mask[i]<1 && arr[j]==arr[i]) { mask[j]++; mask[i]--; } if(mask[i]<0) mask[i] = -mask[i]+1; } //count the number of single elements for(i=0, single=0;i<N;i++) if(!mask[i]) single++; if(single) //create array of singles { temp = (int*)calloc(single, sizeof(int)); for(i=0, j=0;i<N;i++) if(!mask[i]) { temp[j] = arr[i]; j++; } //sorting array of singles for(i=0;i<single;i++) for(j=i+1;j<single;j++) if(temp[i]>temp[j]) { cur=temp[i]; temp[i]=temp[j]; temp[j]=cur; } //placing sorted singles into results ("right tail") for(i=N-single, j=0;i<N;i++, j++) res[i]=temp[j]; } //form results ("left tail") for(i=0,cur=0;i<N;i++) if(mask[i]>1) { for(j=cur;j<cur+mask[i];j++) res[j]=arr[i]; cur += mask[i]; } //THE RESULT! printf("\nSorted array:\n"); for(i=0;i<N;i++) printf("%3d",res[i]); getchar(); return 0; }
Объяснение кода листинга программы
- Подключение необходимых библиотек Начало: 1 Конец: 1
- Инициализация массива через случайную генерацию Начало: 2 Конец: 4
- Формирование маски-массива Начало: 5 Конец: 12
- Подсчет количества уникальных элементов Начало: 13 Конец: 15
- Выделение памяти под массив одиночных элементов Начало: 16 Конец: 17
- Копирование одиночных элементов в новый массив Начало: 18 Конец: 21
- Сортировка массива одиночных элементов Начало: 22 Конец: 24
- Копирование отсортированных одиночных элементов в итоговый массив Начало: 25 Конец: 27
- Формирование итогового массива Начало: 28 Конец: 36
- Вывод итогового массива Начало: 37 Конец: 39
- Ввод для подтверждения выхода из программы Начало: 40 Конец: 41
- Завершение программы Начало: 42 Конец: 42
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д