Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Rahmanovskiy Andrey
- 161
- Visual studio 2015
- All done
- */
- #define _CRT_SECURE_NO_WARNINGS
- #include<iostream>;
- #include<ctime>
- #include<Windows.h>
- #include<time.h>
- #include<algorithm>
- #include<string>
- #include<cstring>
- using namespace std;
- const int count1 = 100;
- const int maxm = 8000;
- const int sorts_cnt = 7;
- const int MAXN = 9000;
- const int MINN = 1000;
- union union1 { // union
- unsigned int a;
- unsigned char b[4];
- };
- void radix_sort(int Array[], int N) {
- union1* my_un = new union1[N];
- int* values_cnt;
- union1* Helper;
- for (int i = 0; i < N; i++)
- my_un[i].a = Array[i];
- for (int byt = 0; byt < 4; byt++) // Share the bytes
- {
- int max1 = 256;
- values_cnt = new int[max1];
- Helper = new union1[N];
- for (int i = 0; i < max1; i++) // Count sort
- values_cnt[i] = 0;
- for (int i = 0; i < N; i++)
- values_cnt[my_un[i].b[byt]]++;
- for (int i = 1; i < max1; i++)
- values_cnt[i] = values_cnt[i] + values_cnt[i - 1];
- for (int i = N - 1; i >= 0; --i)
- {
- Helper[values_cnt[my_un[i].b[byt]] - 1] = my_un[i];
- values_cnt[my_un[i].b[byt]] = values_cnt[my_un[i].b[byt]] - 1;
- }
- for (int i = 0; i < N; i++)
- my_un[i] = Helper[i];
- }
- for (int i = 0; i < N; i++)
- Array[i] = my_un[i].a;
- }
- void count_sort(int Array_copy[], int N) {
- int *values_cnt = new int[maxm];
- int *Helper = new int[N];
- for (int i = 0; i < maxm; i++)
- values_cnt[i] = 0;
- for (int i = 0; i < N; i++)
- values_cnt[Array_copy[i]]++;
- for (int j = 1; j < maxm; j++)
- values_cnt[j] = values_cnt[j] + values_cnt[j - 1];
- for (int i = N - 1; i >= 0; i--) {
- Helper[values_cnt[Array_copy[i]] - 1] = Array_copy[i];
- values_cnt[Array_copy[i]] = values_cnt[Array_copy[i]] - 1;
- }
- for (int i = 0; i < N; i++)
- Array_copy[i] = Helper[i];
- }
- void insertion_sort(int Array[], int N) {
- for (int i = 1; i < N; i++) {
- for (int j = i - 1; j >= 0; j--) {
- if (Array[j] > Array[j + 1]) {
- int t = Array[j];
- Array[j] = Array[j + 1];
- Array[j + 1] = t;
- }
- }
- }
- }
- void binary_insertion_sort(int Array[], int N) {
- for (int i = 1; i < N; i++) {
- int pos = 0, r = i;
- while (r - pos != 0) {
- int c = (r + pos) / 2;
- if (Array[c] > Array[i])
- r = c;
- else
- pos = c + 1;
- }
- int tmp = Array[i]; // Save current element
- for (int j = i; j > pos; j--) // shift to the right
- {
- Array[j] = Array[j - 1];
- }
- Array[pos] = tmp;
- }
- }
- void bubble(int Array[], int N) {
- for (int i = 0; i < N; i++) {
- for (int j = 0; j < N - i - 1; j++) {
- if (Array[j] > Array[j + 1]) {
- int t = Array[j];
- Array[j] = Array[j + 1];
- Array[j + 1] = t;
- }
- }
- }
- }
- void bubble_Aiverson1(int Array[], int N) { // Пузырек с 1 условием Айверсона
- for (int i = 0; i < N; i++) {
- bool count_change = 0;
- for (int j = 0; j < N - i - 1; j++) {
- if (Array[j] > Array[j + 1]) {
- int t = Array[j];
- Array[j] = Array[j + 1];
- Array[j + 1] = t;
- count_change = 1; // Check changes
- }
- }
- if (!count_change) // if not changes - break
- return;
- }
- }
- void bubble_Aiverson2(int Array[], int N) {
- int last_change = N - 1;
- int last_change_now = N - 1;
- for (int i = 0; i < N; i++) {
- if (last_change_now == 0)
- return;
- last_change = last_change_now;
- last_change_now = 0;
- for (int j = 0; j < last_change; j++) {
- if (Array[j] > Array[j + 1]) {
- int t = Array[j];
- Array[j] = Array[j + 1];
- Array[j + 1] = t;
- last_change_now = j;
- }
- }
- }
- }
- void Clean(int Array_copy[], int Array[], int N) { // Clean changable array
- for (int i = 0; i < N; i++) // copy array
- Array_copy[i] = Array[i];
- }
- typedef void(*pf)(int Array[], int N); // A pointer to the function
- int main() {
- DWORD each_sort_info[7][4][9];
- freopen("out.csv", "w", stdout);
- setlocale(LC_ALL, "Russian"); // Russian language
- srand(time(0)); // Random
- cout << endl;
- pair<string, pf> *Array_sorts = new pair<string, pf>[sorts_cnt];
- Array_sorts[0].first = "Bubble";
- Array_sorts[0].second = bubble;
- Array_sorts[1].first = "Bubble with Aiverson 1";
- Array_sorts[1].second = bubble_Aiverson1;
- Array_sorts[2].first = "Bubble with Aiverson 2";
- Array_sorts[2].second = bubble_Aiverson2;
- Array_sorts[3].first = "Insertion sort";
- Array_sorts[3].second = insertion_sort;
- Array_sorts[4].first = "Binary insertion sort";
- Array_sorts[4].second = binary_insertion_sort;
- Array_sorts[5].first = "Count sort";
- Array_sorts[5].second = count_sort;
- Array_sorts[6].first = "Radix sort";
- Array_sorts[6].second = radix_sort;
- cout << "Lenght of Array;";
- for (int i = 0; i < sorts_cnt; i++)
- cout << Array_sorts[i].first << ";";
- int *Global_array = new int[MAXN]; // Create main array
- for (int i = 0; i < MAXN; i++)
- Global_array[i] = rand() % 8;
- for (int N = MINN; N <= MAXN; N += MINN) { // 1000, 2000 ... 9000
- cout << endl;
- cout << N << ";";
- int *Array = new int[N];
- for (int i = 0; i < N; i++) // Create immutable internal array
- Array[i] = Global_array[i];
- int *Array_copy = new int[N];
- for (int i = 0; i < sorts_cnt; i++) {
- Clean(Array_copy, Array, N);
- Array_sorts[i].second(Array_copy, N); // Optimizing compiler
- }
- for (int sort_num = 0; sort_num < sorts_cnt; sort_num++) { // Enumeration sorts
- LARGE_INTEGER sred;
- sred.QuadPart = 0;
- //cout << Array_sorts[sort_num].first << endl;
- Clean(Array_copy, Array, N);
- for (int i = 0; i < count1; i++) { // Statr sotring 100 count
- Clean(Array_copy, Array, N);
- LARGE_INTEGER Fr, StT, FT, TT;
- QueryPerformanceFrequency(&Fr); // Count time
- QueryPerformanceCounter(&StT);
- Array_sorts[sort_num].second(Array_copy, N); // statr sorting
- QueryPerformanceCounter(&FT);
- TT.QuadPart = (FT.QuadPart - StT.QuadPart);
- TT.QuadPart = TT.QuadPart * 1000000000 / Fr.QuadPart;
- sred.QuadPart += TT.QuadPart;
- }
- cout << sred.QuadPart / count1<< ";";
- each_sort_info[sort_num][0][N / MINN - 1] = sred.QuadPart / count1; // Save dates
- //print(Array_copy, N);
- }
- delete[] Array_copy; // Очистка памяти
- delete[] Array;
- }
- freopen("out2.csv", "w", stdout);
- cout << "Lenght of Array;";
- for (int i = 0; i < sorts_cnt; i++)
- if (i != 5)
- cout << Array_sorts[i].first << ";";
- for (int i = 0; i < MAXN; i++)
- Global_array[i] = rand();
- for (int N = MINN; N <= MAXN; N += MINN) {
- cout << endl;
- cout << N << ";";
- int *Array = new int[N];
- for (int i = 0; i < N; i++)
- Array[i] = Global_array[i];
- int *Array_copy = new int[N];
- for (int i = 0; i < sorts_cnt; i++) {
- if (i == 5)
- continue;
- Clean(Array_copy, Array, N);
- Array_sorts[i].second(Array_copy, N);
- }
- for (int sort_num = 0; sort_num < sorts_cnt; sort_num++) {
- if (sort_num == 5)
- continue;
- LARGE_INTEGER sred;
- sred.QuadPart = 0;
- Clean(Array_copy, Array, N);
- for (int i = 0; i < count1; i++) {
- Clean(Array_copy, Array, N);
- LARGE_INTEGER Fr, StT, FT, TT;
- QueryPerformanceFrequency(&Fr);
- QueryPerformanceCounter(&StT);
- Array_sorts[sort_num].second(Array_copy, N);
- QueryPerformanceCounter(&FT);
- TT.QuadPart = (FT.QuadPart - StT.QuadPart);
- TT.QuadPart = TT.QuadPart * 1000000000 / Fr.QuadPart;
- sred.QuadPart += TT.QuadPart;
- }
- cout << sred.QuadPart / count1 << ";";
- each_sort_info[sort_num][1][N / MINN - 1] = sred.QuadPart / count1;
- }
- delete[] Array_copy; // Clean memory
- delete[] Array;
- }
- freopen("out3.csv", "w", stdout);
- cout << "Lenght of Array;";
- for (int i = 0; i < sorts_cnt; i++)
- cout << Array_sorts[i].first << ";";
- for (int i = 0; i < MAXN; i++)
- Global_array[i] = rand() % maxm;
- bubble(Global_array, MAXN);
- for (int N = MINN; N <= MAXN; N += MINN) {
- cout << endl;
- cout << N << ";";
- int *Array = new int[N];
- for (int i = 0; i < N; i++)
- Array[i] = Global_array[i];
- for (int i = 0; i < 5; i++) {
- int x = rand() % N;
- int y = rand() % N;
- swap(Array[x], Array[y]);
- }
- int *Array_copy = new int[N];
- for (int i = 0; i < sorts_cnt; i++) {
- Clean(Array_copy, Array, N);
- Array_sorts[i].second(Array_copy, N);
- }
- for (int sort_num = 0; sort_num < sorts_cnt; sort_num++) {
- LARGE_INTEGER sred;
- sred.QuadPart = 0;
- Clean(Array_copy, Array, N);
- for (int i = 0; i < count1; i++) {
- Clean(Array_copy, Array, N);
- LARGE_INTEGER Fr, StT, FT, TT;
- QueryPerformanceFrequency(&Fr);
- QueryPerformanceCounter(&StT);
- Array_sorts[sort_num].second(Array_copy, N);
- QueryPerformanceCounter(&FT);
- TT.QuadPart = (FT.QuadPart - StT.QuadPart);
- TT.QuadPart = TT.QuadPart * 1000000000 / Fr.QuadPart;
- sred.QuadPart += TT.QuadPart;
- }
- cout << sred.QuadPart / count1 << ";";
- each_sort_info[sort_num][2][N / MINN - 1] = sred.QuadPart / count1;
- }
- delete[] Array_copy; // Clean memmory
- delete[] Array;
- }
- freopen("out4.csv", "w", stdout);
- cout << "Lenght of Array;";
- for (int i = 0; i < sorts_cnt; i++)
- cout << Array_sorts[i].first << ";";
- for (int i = 0; i < MAXN; i++)
- Global_array[i] = rand() % maxm;
- bubble(Global_array, MAXN);
- int *Global_array1 = new int[MAXN];
- for (int i = 0; i < MAXN; i++)
- Global_array1[i] = Global_array[MAXN - i - 1];
- for (int i = 0; i < MAXN; i++)
- Global_array[i] = Global_array1[i];
- for (int N = MINN; N <= MAXN; N += MINN) {
- cout << endl;
- cout << N << ";";
- int *Array = new int[N];
- for (int i = 0; i < N; i++)
- Array[i] = Global_array[i];
- for (int i = 0; i < 5; i++) {
- int x = rand() % N;
- int y = rand() % N;
- swap(Array[x], Array[y]);
- }
- int *Array_copy = new int[N];
- for (int i = 0; i < sorts_cnt; i++) {
- Clean(Array_copy, Array, N);
- Array_sorts[i].second(Array_copy, N);
- }
- for (int sort_num = 0; sort_num < sorts_cnt; sort_num++) {
- LARGE_INTEGER sred;
- sred.QuadPart = 0;
- Clean(Array_copy, Array, N);
- for (int i = 0; i < count1; i++) {
- Clean(Array_copy, Array, N);
- LARGE_INTEGER Fr, StT, FT, TT;
- QueryPerformanceFrequency(&Fr);
- QueryPerformanceCounter(&StT);
- Array_sorts[sort_num].second(Array_copy, N);
- QueryPerformanceCounter(&FT);
- TT.QuadPart = (FT.QuadPart - StT.QuadPart);
- TT.QuadPart = TT.QuadPart * 1000000000 / Fr.QuadPart;
- sred.QuadPart += TT.QuadPart;
- }
- cout << sred.QuadPart / count1 << ";";
- each_sort_info[sort_num][3][N / MINN - 1] = sred.QuadPart / count1;
- }
- delete[] Array_copy; // Clean memory
- delete[] Array;
- }
- // Write date about each sort
- freopen("1.csv", "w", stdout);
- cout << "Lenght of array; 0-7; max int; near sort; revers;" << endl;
- for (int j = 0; j < 9; j++) {
- cout << (j + 1) * MINN << ";";
- for (int k = 0; k < 4; k++) {
- cout << each_sort_info[0][k][j] << ";";
- }
- cout << endl;
- }
- freopen("2.csv", "w", stdout);
- cout << "Lenght of array; 0-7; max int; near sort; revers;" << endl;
- for (int j = 0; j < 9; j++) {
- cout << (j + 1) * MINN << ";";
- for (int k = 0; k < 4; k++) {
- cout << each_sort_info[1][k][j] << ";";
- }
- cout << endl;
- }
- freopen("3.csv", "w", stdout);
- cout << "Lenght of array; 0-7; max int; near sort; revers;" << endl;
- for (int j = 0; j < 9; j++) {
- cout << (j + 1) * MINN << ";";
- for (int k = 0; k < 4; k++) {
- cout << each_sort_info[2][k][j] << ";";
- }
- cout << endl;
- }
- freopen("4.csv", "w", stdout);
- cout << "Lenght of array; 0-7; max int; near sort; revers;" << endl;
- for (int j = 0; j < 9; j++) {
- cout << (j + 1) * MINN << ";";
- for (int k = 0; k < 4; k++) {
- cout << each_sort_info[3][k][j] << ";";
- }
- cout << endl;
- }
- freopen("5.csv", "w", stdout);
- cout << "Lenght of array; 0-7; max int; near sort; revers;" << endl;
- for (int j = 0; j < 9; j++) {
- cout << (j + 1) * MINN << ";";
- for (int k = 0; k < 4; k++) {
- cout << each_sort_info[4][k][j] << ";";
- }
- cout << endl;
- }
- freopen("6.csv", "w", stdout);
- cout << "Lenght of array; 0-7; max int; near sort; revers;" << endl;
- for (int j = 0; j < 9; j++) {
- cout << (j + 1) * MINN << ";";
- for (int k = 0; k < 4; k++) {
- cout << each_sort_info[5][k][j] << ";";
- }
- cout << endl;
- }
- freopen("7.csv", "w", stdout);
- cout << "Lenght of array; 0-7; max int; near sort; revers;" << endl;
- for (int j = 0; j < 9; j++) {
- cout << (j + 1) * MINN << ";";
- for (int k = 0; k < 4; k++) {
- cout << each_sort_info[6][k][j] << ";";
- }
- cout << endl;
- }
- delete[] Global_array;
- delete[] Global_array1;
- //system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement