Шейкерная сортировка одномерного массива - C (СИ)

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

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

Есть два массива. методом Шейкера отсортировать элементы первого массива, которых нет во втором. на языке Си. пример: 3 5 7 8 2 3 7 результат после сортировки: 3 2 7 5 8
аааааа.....быстрее.....пожалуйста......осталось 20 минут!!!!!!!!! зачет или не зачет....срочно!!!!!
......заплачууу......20$ закинуу на киви или веб-мани
осталось 15 минут.....

Решение задачи: «Шейкерная сортировка одномерного массива»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int main(void)
{
    const int size1 = 5;
    const int size2 = 2;
    int arr1[size1];
    int arr2[size2];
 
    srand(time(NULL));
 
    for (int i = 0; i < size1; i++)
           arr1[i] = rand() % 100;
 
    for (int i = 0; i < size2; i++)
           arr2[i] = arr1[rand() % size1]; 
 
    printf("a: ");
    for (int i = 0; i < size1; i++)
        printf ("%d ", arr1[i]);
    printf("\n");
    printf("b: ");
    for (int i = 0; i < size2; i++)
        printf ("%d ", arr2[i]);
    printf("\n"); 
    for (int left = 0, right = size1-1; left < right;)
    {
        for (int idx  = left, l_idx = -1, r_idx = -1; idx <= right; idx++)
        {
            int i;
            for (i = 0; i < size2; i++)
                if (arr1[idx] == arr2[i]) break;
            if (i == size2)
                if (l_idx == -1) l_idx = idx; 
                else r_idx = idx;
 
            if ( (l_idx != -1) && (r_idx != -1)) {
 
                if(arr1[r_idx] < arr1[l_idx]) {
                    int tmp = arr1[l_idx];
                    arr1[l_idx] = arr1[r_idx];
                    arr1[r_idx] = tmp;
                    idx = l_idx;
                } else {
                    idx = r_idx;
                    l_idx = r_idx;
                }
                r_idx = -1;
            }
        }
        right--;
        for (int idx = right, l_idx = -1, r_idx = -1; idx >= left; idx--)
        {
            int i;
            for (i = 0; i < size2; i++)
                if (arr1[idx] == arr2[i]) break;
            if (i == size2)
                if (r_idx == -1) r_idx = idx;
                else l_idx = idx;
 
            if ((l_idx != -1) && (r_idx != -1)) {
 
                if  (arr1[l_idx] >  arr1[r_idx]) { 
                    int tmp = arr1[l_idx];
                    arr1[l_idx] = arr1[r_idx];
                    arr1[r_idx] = tmp;
                    idx = r_idx;
 
                } else {
                    idx = l_idx;
                    r_idx = l_idx;
                    
                }
                l_idx = -1;
            }
        }
        left++;
    }
    printf("a: ");
    for (int i = 0; i < size1; i++)
        printf ("%d ", arr1[i]);
    printf("\n");
 
    return 0;
}

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

Код реализует алгоритм Шейкерной сортировки для одномерного массива. Список действий:

  1. Инициализация переменных:
    • объявление массивов arr1 и arr2;
    • задание размера массивов size1 и size2;
    • инициализация генератора случайных чисел srand(time(NULL));
    • заполнение массива arr1 случайными числами от 0 до 99;
    • заполнение массива arr2 элементами из arr1.
  2. Основной цикл сортировки:
    • перебираем элементы массива arr1, начиная с первого и до предпоследнего;
    • для каждого элемента:
    • находим его пары в arr2, перебирая все элементы массива arr2;
    • если пары нет, то элемент уже на своем месте;
    • если пары есть, и пара находится правее текущего элемента, то меняем элементы местами;
    • если пары есть, и пара находится левее текущего элемента, то меняем элементы местами и переворачиваем массив.
  3. Завершение сортировки:
    • выводим отсортированный массив arr1. Алгоритм называется Шейкерная сортировка, потому что он перетряхивает массив, сравнивая пары соседних элементов.

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


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

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

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