Quick actions

cmd+k|ctrl+k

Navigation

Languages

Lab_4_1, 515i, Darchuk Hlib Serhiyovic

Snippet info

Language

C

Visibility

public

Author

h.s.darchuk

Created

2025-05-13T22:35:50.107704Z

Updated

2025-05-13T22:39:25.655667Z

/*
* @file Lab_4_1.c
* @author Дарчук Г.С., 515i
* @date 14.05.2025
* @brief Лабораторна робота №4, варіант 22
*
* Функції. Швидке сортування. Робота з відлагоджувачем. Завдання 1
*/

/* Швидке сортування */
#include <stdio.h>
#include <stdlib.h>

/* функція швидкого сортування */
void quicksort(int a[], int low, int high);

/* функція розділу масива */
int split(int a[], int low, int high);

void write_by_keyboard(int arr[], int N)
{
    for (int i = 0; i < N; i++)
    {
        printf("Введіть %d елемент масиву для сортування:", i);
        scanf("%d", &arr[i]);
    }
}

void write_by_random(int arr[], int N, int range)
{
    // Для кращої читаності випадкові числа обмежені 300-ми числами
    for (int i = 0; i < N; i++) arr[i] = rand()%range;
}

void writeArray(int arr[], int N)
{
    for (int i = 0; i < N; i++) printf("%d ", arr[i]);
    printf("\n");
}

/* функція main */
int main()
{
    int length;
    int choice;
    int range;
    printf("Введіть кількість елементів масиву: ");
    scanf("%d", &length);
    if (length <= 0)
    {
        printf("Помилка: массив не може бути меньшим або дорівнювати 0!\n");
        return 1;
    }
    int* a = (int*)malloc(length * sizeof(int));
    printf("Ввести елементи масиву з клавіатури (введіть 0) чи випадковим чином (введіть 1): ");
    scanf("%d", &choice);
    if (choice == 0) write_by_keyboard(a, length);
    else if (choice == 1)
    {
        printf("Введіть обмеження (максимальне випадкове число): ");
        scanf("%d", &range);
        write_by_random(a, length, range);
    }
    else
    {
        printf("Помилка: Введено інше число!\n");
        return 1;
    }
    printf("Вигляд масиву: ");
    writeArray(a, length);
    quicksort(a, 0, length - 1);
    printf("Вигляд відсортованного масиву: ");
    writeArray(a, length);
    return 0;
}

void quicksort(int a[], int low, int high)
{
  int middle;
  if (low >= high) return;
  middle = split(a, low, high);
  quicksort(a, low, middle - 1);
  quicksort(a, middle + 1, high);
}

int split(int a[], int low, int high)
{
    int part_element = a[low];
    for(;;)
    {
        while (low < high && part_element >= a[high]) high--;
        if (low >= high) break;
        a[low++] = a[high];
        while (low < high && a[low] >= part_element) low++;
        if (low >= high) break;
        a[high--] = a[low];
    }
    a[high] = part_element;
    return high;
}
INFO