Сортировка элементов массива так, что сначала идут все повторяющиеся элементы - 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 Конец: 1
  2. Инициализация массива через случайную генерацию Начало: 2 Конец: 4
  3. Формирование маски-массива Начало: 5 Конец: 12
  4. Подсчет количества уникальных элементов Начало: 13 Конец: 15
  5. Выделение памяти под массив одиночных элементов Начало: 16 Конец: 17
  6. Копирование одиночных элементов в новый массив Начало: 18 Конец: 21
  7. Сортировка массива одиночных элементов Начало: 22 Конец: 24
  8. Копирование отсортированных одиночных элементов в итоговый массив Начало: 25 Конец: 27
  9. Формирование итогового массива Начало: 28 Конец: 36
  10. Вывод итогового массива Начало: 37 Конец: 39
  11. Ввод для подтверждения выхода из программы Начало: 40 Конец: 41
  12. Завершение программы Начало: 42 Конец: 42

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


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

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

5   голосов , оценка 4 из 5
Похожие ответы