Мне нужно отсортировать массив по цене взятой из структуры. Какую сортировку лучше всего использовать (без пузырьковой) #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; } } } } 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; } } } }
Envil, для сортировки массива по цене, можно использовать быструю сортировку (QuickSort) или сортировку слиянием (MergeSort). Они обе имеют асимптотическую сложность O(n*log(n)) и могут быть эффективными для больших массивов. Вот пример реализации быстрой сортировки для вашего массива структур: 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); } 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.
vtlstolyarov, что это за сортировка такая с асимптотикой O(n+k)? Вы новый метод изобрели? Приведите название алгоритма и пример кода.
что значит лучше всего использовать? по асимптотике? по имлементации? если по кейсу то радиус, бакет сорт. если удобство: то квик сорт или слияние