Загрузка...

What is the most efficient sorting method?

Thread in C/C++ created by Envil Apr 30, 2023. 177 views

  1. Envil
    Envil Topic starter Apr 30, 2023 https://zelenka.guru/threads/5425786/ -изи 500р 97 Sep 1, 2019
    Мне нужно отсортировать массив по цене взятой из структуры. Какую сортировку лучше всего использовать (без пузырьковой)
    C
    #include <iostream>
    #include <string>
    #include <stdio.h>
    #include <locale.h>
    #include <iomanip>
    #include <windows.h>
    using namespace std;
    const int N = 10;

    int main() {
    int sizeTov = 0;
    FILE* file1;
    struct tovar {
    string name;
    float kol;
    string price;
    string proiz;
    }tov[N];


    int A;
    while (true)
    {
    cout << "Что вы хотите сделать??" << endl;
    cout << "1. Отсортировать по цене" << endl;
    cout << "2. Отсортировать по имени" << endl;
    cout << "3. Отсортировать по Колличеству" << endl;
    cout << "4. Выход" << endl;
    cout << "5. Дополнить таблицу" << endl;
    cout << "6. Вывести таблицу" << endl;

    cin >> A;
    switch (A)
    {
    case 1: {
    for (int i = 0; i < N - 1; i++) {
    for (int j = 0; j < N - i - 1; j++) {
    if (tov[j].price < tov[j + 1].price) {
    tovar temp = tov[j];
    tov[j] = tov[j + 1];
    tov[j + 1] = temp;
    }
    }

    }
    for (int i = 0; i < sizeTov; i++) {

    cout << "|" << setw(18) << setfill(' ') << tov[i].name << "|"
    << setw(15) << setfill(' ') << tov[i].kol << "|"
    << setw(12) << setfill(' ') << tov[i].price << "|"
    << setw(15) << setfill(' ') << tov[i].proiz << "|" << endl;
    }
    break;
    }

    case 2: {
    for (int i = 0; i < sizeTov - 1; i++) {
    for (int j = 0; j < sizeTov - i - 1; j++) {
    if (tov[j].name > tov[j + 1].name) {
    tovar temp = tov[j];
    tov[j] = tov[j + 1];
    tov[j + 1] = temp;
    }
    }
    }
    for (int i = 0; i < sizeTov; i++) {
    cout << "|" << setw(18) << setfill(' ') << tov[i].name << "|"
    << setw(15) << setfill(' ') << tov[i].kol << "|"
    << setw(12) << setfill(' ') << tov[i].price << "|"
    << setw(15) << setfill(' ') << tov[i].proiz << "|" << endl;
    }

    break;
    }

    case 3: {
    for (int i = 0; i < N - 1; i++) {
    for (int j = 0; j < N - i - 1; j++) {
    if (tov[j].kol < tov[j + 1].kol) {
    tovar temp = tov[j];
    tov[j] = tov[j + 1];
    tov[j + 1] = temp;
    }
    }
    }
    for (int i = 0; i < sizeTov; i++) {
    cout << "|" << setw(18) << setfill(' ') << tov[i].name << "|"
    << setw(15) << setfill(' ') << tov[i].kol << "|"
    << setw(12) << setfill(' ') << tov[i].price << "|"
    << setw(15) << setfill(' ') << tov[i].proiz << "|" << endl;
    }

    break;
    }

    case 4: {
    cout << "Конец работы";

    }
    case 5: {
    FILE* file1 = fopen("inf.txt", "wb");
    cout << "Введите название товара: ";
    cin >> tov[sizeTov].name;
    cin.ignore();
    cout << "Введите количество товара: ";
    cin >> tov[sizeTov].kol;
    cin.ignore(); // нужно, чтобы считать строку следующего поля
    cout << "Введите цену товара: ";
    getline(cin, tov[sizeTov].price);
    cout << "Введите производителя товара: ";
    getline(cin, tov[sizeTov].proiz);
    fwrite(&tov[sizeTov], sizeof(tov[sizeTov]), 1, file1);
    sizeTov++;
    fclose(file1);
    break;
    }
    case 6: {
    file1 = fopen("inf.txt", "rb");
    cout << "|" << setw(44) << setfill('-') << "Таблицы" << setw(20) << "|" << endl;
    cout << "|" << setw(20) << setfill(' ') << "Название товара" << "|" << setw(10) << setfill(' ') << "Кол-во"
    << "|" << setw(15) << setfill(' ') << "Цена" << "|" << setw(15) << setfill(' ') << "Производитель" << "|" << endl;
    for (int i = 0; i < 1; i++) {
    fread(&tov[i], sizeof(tov[i]), 1, file1);
    cout << "|" << setw(20) << setfill(' ') << tov[i].name << "|"
    << setw(10) << setfill(' ') << tov[i].kol << "|"
    << setw(15) << setfill(' ') << tov[i].price << "|"
    << setw(15) << setfill(' ') << tov[i].proiz << "|" << endl;
    }

    fclose(file1);
    break;
    }
    }

    }
    }
     
  2. ChatGPT
    ChatGPT Apr 30, 2023 2250 Mar 14, 2023
    Envil, для сортировки массива по цене, можно использовать быструю сортировку (QuickSort) или сортировку слиянием (MergeSort). Они обе имеют асимптотическую сложность O(n*log(n)) и могут быть эффективными для больших массивов. Вот пример реализации быстрой сортировки для вашего массива структур:

    C

    void quickSort(tovar arr[], int left, int right) {
    int i = left, j = right;
    tovar tmp;
    string pivot = arr[(left + right) / 2].price;

    /* partition */
    while (i <= j) {
    while (arr[i].price < pivot)
    i++;
    while (arr[j].price > pivot)
    j--;
    if (i <= j) {
    tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
    i++;
    j--;
    }
    };

    /* recursion */
    if (left < j)
    quickSort(arr, left, j);
    if (i < right)
    quickSort(arr, i, right);
    }
    Вы можете вызвать эту функцию вместо существующего кода сортировки в вашем switch case 1. Не забудьте объявить функцию quickSort перед main.
     
  3. bobre
    любую за O(nlog(n)), хоть встроенный sort с компаратором
     
    1. vtlstolyarov
      bobre, чел поинтересовался за самую быструю, а не за O(n log(n)), самая быстрая - за O(n+k)
    2. bylex
      vtlstolyarov, что это за сортировка такая с асимптотикой O(n+k)? Вы новый метод изобрели? Приведите название алгоритма и пример кода.
  4. LVV
    что значит лучше всего использовать? по асимптотике? по имлементации? если по кейсу то радиус, бакет сорт. если удобство: то квик сорт или слияние
     
Loading...
Top