C++: заполняем динамический массив случайными целыми значениями и реализуем простую сортировку
В коде формируется динамический целочисленный массив, содержащий
значения из диапазона [0,range[
, затем он сортируется простым "пузырькоподобным" методом и выводится в консоль. Для удобства функции обмена двух значений, сортировки массива и вывода массива в консоль представляют собой шаблоны. Более толковая для больших размерностей сортировка QuickSort показана в этой заметке.
Функция обмена элементов массива назвается swp
, а не swap
, чтобы избежать конфликта со стандартной и ошибки C2668.
#include <iostream> #include <cstdlib> using namespace std; template <typename T> void swp(T &a, T &b) { T c = a; a = b; b = c; } template <typename T> T *sort(T *a, int n) { for (int i = 0; i < n - 1; i++) for (int j = i + 1; j < n; j++) if (a[i]>a[j]) swp(a[i], a[j]); return a; } template <typename T> void print(T *a, int n) { cout << endl; for (int i = 0; i < n; i++) cout << a[i] << (i < n - 1 ? " " : ""); } int main() { const int n = 10; const int range = 100; int *a = new int[n]; for (int i = 0; i < n; i++) a[i] = rand() % range; print(a, n); a = sort(a, n); print(a, n); cin.sync(); cin.get(); return 0; }
Если сортировать просто целочисленный массив, код будет таким:
#include <iostream> #include <cstdlib> using namespace std; void swap(int &a,int &b) { int c = a; a = b; b = c; } int *sort(int *a, int n) { for (int i = 0; i < n - 1; i++) for (int j = i + 1; j < n; j++) if (a[i]>a[j]) swap(a[i], a[j]); return a; } void print(int *a, int n) { cout << endl; for (int i = 0; i < n; i++) cout << a[i] << (i < n - 1 ? " " : ""); } int main() { const int n = 10; const int range = 100; int *a = new int[n]; for (int i = 0; i < n; i++) a[i] = rand() % range; print(a, n); a = sort(a, n); print(a, n); cin.sync(); cin.get(); return 0; }
Не стоит также забывать, что встроенный QuickSort в С++ уже есть, применяя стандартную функцию, мы могли бы написать такой код:
#include <iostream> #include <cstdlib> using namespace std; int compare(const void * a, const void * b) { return (*(int *)a > *(int *)b); //Поменяли тип указателя, потом взяли значение } int main() { const int n=6; int a[n] = { 4, 1, 10, 9, 2, 5 }; qsort (a, n, sizeof(int), compare); cout << endl; for (int i = 0; i < n; i++) cout << a[i] << (i<n-1?" ":""); cin.get(); return 0; }
Все коды проверены в консоли Visual Studio 2015.
06.12.2017, 08:10 [2652 просмотра]