Advertisement
Guest User

Untitled

a guest
Dec 12th, 2019
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.15 KB | None | 0 0
  1. /* Учебная практика 2019
  2. * Байдаров Егор БПИ184
  3. * Среда рaзработки: CLION
  4. * Сделано: 7 видов сортировок для 4 видов массивов, подсчет операций и вывод в файл
  5. * Не сделано: -
  6. */
  7.  
  8. #include <iostream>
  9. #include <fstream>
  10. #include <random>
  11. #include <cmath>
  12. #include <string>
  13. #include <map>
  14. #include <functional>
  15.  
  16. using namespace std;
  17. static long long counter = 0;
  18.  
  19. // своп двух значений
  20. void swap(int& a, int& b)
  21. {
  22. int c = a;
  23. a = b;
  24. b = c;
  25. counter += 3; //3 присваивания
  26. }
  27.  
  28. //поиск максимального эл-та в массиве
  29. int maxArr(int* array, int size)
  30. {
  31. int max = array[0];
  32. counter += 2;
  33. counter += 2;
  34. for (int i = 1; i < size; i++)
  35. {
  36. counter += 2;
  37. if (array[i] > max)
  38. {
  39. max = array[i];
  40. counter += 2;
  41. }
  42. counter += 3;
  43. }
  44. return max;
  45.  
  46. }
  47.  
  48. void countSort(int* array, int size)
  49. {
  50. int* output = new int[size];
  51. counter = 1;
  52. int max = maxArr(array, size);
  53. counter += 1;
  54. int* count = new int[max + 1]; // создание массива из max + 1 элементов
  55. counter += 2;
  56. counter += 3;
  57. for (int i = 0; i < max + 1; i++)
  58. {
  59. counter += 2;
  60. count[i] = 0;// инициализация
  61. counter += 4;
  62. }
  63. counter += 2;
  64. for (int i = 0; i < size; ++i)
  65. {
  66. counter += 4;
  67. ++count[array[i]]; // подсчет элементов
  68. counter += 3;
  69. }
  70. counter += 3;
  71. for (int i = 1; i < max + 1; ++i)
  72. {
  73. counter += 5;
  74. count[i] += count[i - 1];
  75. counter += 4;
  76. }// поиск комулятивных частот
  77. counter += 3;
  78. for (int i = size - 1; i > -1; i--)
  79. {
  80. int a = array[i];
  81. output[count[a] - 1] = a;
  82. count[a]--; //уменьшение числа одинаковых элементов
  83. counter += 11;
  84. }
  85. counter += 2;
  86. delete[] count;
  87. delete[] output;
  88. }
  89.  
  90. static void countSortR(int* arr, int n, int exp)
  91. {
  92. counter += 2;
  93. int* output = new int[n]; // массив результатов
  94. int i;
  95. int* count = new int[256]; //массив для подсчета вхождений различных елементов
  96. counter += 2;
  97. for (int i = 0; i < 256; i++)
  98. {
  99. counter += 2;
  100. count[i] = 0; // его инициализация
  101. counter += 3;
  102. }
  103. counter += 2;
  104. for (i = 0; i < n; i++)
  105. {
  106. counter += 6;
  107. count[(arr[i] / exp) % 256]++;// подсчет элементов
  108. counter += 3;
  109. }
  110. counter += 2;
  111. for (i = 1; i < 256; i++)
  112. {
  113. counter += 5;
  114. count[i] += count[i - 1]; // получение коммулятивных частот чисел
  115. counter += 3;
  116. }
  117. counter += 3;
  118. for (i = n - 1; i >= 0; i--)
  119. {
  120. counter += 14;
  121. output[count[(arr[i] / exp) % 256] - 1] = arr[i];
  122. count[(arr[i] / exp) % 256]--;// уменьшение числа одинаковых эл-ов
  123. counter += 3;
  124. }
  125.  
  126. delete[] count;
  127. delete[] output;
  128.  
  129. }
  130.  
  131. void radixSort(int arr[], int n)
  132. {
  133. counter = 1;
  134. int m = maxArr(arr, n); // поиск максимального
  135. counter += 3;
  136. for (int exp = 1; m / exp > 0; exp *= 256) //что-то неведанное
  137. {
  138. countSortR(arr, n, exp);
  139. counter += 4;
  140. }
  141. }
  142.  
  143. void bubbleIver1(int* arr, int len)
  144. {
  145. counter = 2;
  146. int i = 0;
  147. bool fl = true; // флаг для цицла
  148. counter += 1;
  149. while (fl == true)
  150. { // пока замены есть цикл
  151. fl = false;
  152.  
  153. counter++;// 1 присваивание
  154. counter += 4;// 1 сравнение перед попаданием в цикл, 1 инициаизация
  155. for (int j = 0; j < len - i - 1; ++j)
  156. {
  157. counter += 4;
  158. if (arr[j] > arr[j + 1])
  159. {
  160. swap(arr[j], arr[j + 1]); // pfvtyf lde[ 'ktvtynjd
  161. fl = true;
  162. counter += 4;// 1 присваивание, 2 взятия эл массива
  163. }
  164. counter += 5;//2 взятия эл массива, 1 сравнение
  165. }
  166. ++i;
  167. counter += 3;// 1 инкремент
  168. }
  169. }
  170.  
  171. void bubble(int* arr, int n)
  172. { // простая сортировка пузырьком
  173. counter = 3; // инициализация и сравнение
  174. for (int j = n - 1; j > 0; --j)
  175. {
  176. counter += 2; // инициализация и сравнение
  177. for (int i = 0; i < j; ++i)
  178. {
  179. counter += 4;
  180. if (arr[i + 1] < arr[i])
  181. {
  182. counter += 3;//
  183. swap(arr[i], arr[i + 1]);
  184. }
  185. counter += 3; //сравнение инкремент
  186. }
  187. counter += 3; //сравнение инкремент
  188. }
  189. }
  190.  
  191. void bubbleIver12(int* array, int N)
  192. {
  193. counter = 1;
  194. int t = N;
  195. counter += 1;
  196. while (t != 0)
  197. { // пока замены есть цикл
  198. int bound = t;
  199. counter += 2;
  200. t = 0;
  201. counter += 2;
  202. for (int i = 1; i < bound; ++i)
  203. { // проход по сассиву до границы
  204. counter += 4;
  205. if (array[i] < array[i - 1])
  206. {
  207.  
  208. swap(array[i], array[i - 1]); // замены двух элементоа
  209. t = i;
  210. counter += 4;
  211. }
  212. counter += 3;
  213. }
  214. counter += 1;
  215. }
  216. }
  217.  
  218. void simpleInsert(int* arr, int len)
  219. { // простые вставки
  220. counter = 2;
  221. for (int i = 1; i < len; i++)
  222. {
  223. if (i > 0)
  224. counter += 7;
  225. else
  226. counter += 2;
  227. for (int j = i; j > 0 && arr[j - 1] > arr[j]; j--)
  228. { // сдвиг меньшего элемента влево
  229. counter += 3;
  230. swap(arr[j - 1], arr[j]);
  231. if (j - 1 > 0)
  232. counter += 8;
  233. else
  234. counter += 3;
  235. }
  236. }
  237. }
  238.  
  239. void binaryInsert(int* arr, int n)
  240. { // вставки с бин поиском
  241. counter = 2;
  242. for (int i = 0; i < n; ++i)
  243. {
  244. counter += 5;
  245. int left = 0, right = i;
  246. int temp = arr[i];
  247. while (left < right)
  248. { //бинарный поиск
  249. counter += 6;
  250. int mid = left + (right - left) / 2;
  251. if (temp < arr[mid])
  252. {
  253. right = mid;
  254. counter++;
  255. } else
  256. {
  257. left = mid + 1;
  258. counter += 2;
  259. }
  260. counter++;
  261. }
  262. counter += 3;
  263. for (int j = i; j >= left + 1; --j)
  264. { //сдвиг влево меньшего элемента
  265. counter += 8;
  266. arr[j] = arr[j - 1];
  267. }
  268. counter += 5;
  269. arr[left] = temp;
  270. }
  271. }
  272.  
  273. // генерация массива числами 0 -9
  274. void randomRange0To9(int* arr, int len)
  275. {
  276. srand(0);
  277. for (int i = 0; i < len; ++i)
  278. arr[i] = rand() % 10;
  279. }
  280.  
  281. // генерация массива числами 0 -10000
  282. void randomRange0To10000(int* arr, int len)
  283. {
  284. srand(0);
  285. for (int i = 0; i < len; ++i)
  286. arr[i] = rand() % 10001;
  287. }
  288.  
  289. // генерация почти отсортированного массива
  290. void almostSorted(int* arr, int len)
  291. {
  292. srand(0);
  293. for (int i = 0; i < len; ++i)
  294. arr[i] = i;
  295. for (int i = 1; i < 10; ++i)
  296. swap(arr[len - i * 100], arr[len - i * 10]);
  297. }
  298.  
  299. //генерация обратно сортированного массива
  300. void sortedFrom10000To1(int* arr, int len)
  301. {
  302. srand(0);
  303. for (int i = len; i > 0; --i)
  304. arr[len - i] = i;
  305. }
  306.  
  307.  
  308. int main()
  309. {
  310. // ofstream fout("output.csv");
  311. //
  312. // //заголовок таблицы
  313. // string header1 = "ELEMENTS COUNT; bubble - randomRange0To9; bubble - randomRange0To10000; bubble - almostSorted; bubble - sortedFrom10000To1;"
  314. // "bubbleIver1 - randomRange0To9; bubbleIver1- randomRange0To10000; bubbleIver1- almostSorted; bubbleIver1- sortedFrom10000To1;"
  315. // "bubbleIver12 - randomRange0To9;bubbleIver12 - randomRange0To10000; bubbleIver12- almostSorted; bubbleIver12- sortedFrom10000To1;"
  316. // "simpleInsert - randomRange0To9; simpleInsert- randomRange0To10000; simpleInsert- almostSorted; simpleInsert- sortedFrom10000To1;"
  317. // "binaryInsert - randomRange0To9; binaryInsert- randomRange0To10000; binaryInsert- almostSorted; binaryInsert- sortedFrom10000To1;"
  318. // "countSort - randomRange0To9; countSort- randomRange0To10000; countSort- almostSorted; countSort - sortedFrom10000To1;"
  319. // " radixSort - randomRange0To9; radixSort- randomRange0To10000; radixSort - almostSorted; radixSort- sortedFrom10000To1;";
  320. // fout << header1 << endl;
  321. //
  322. // // массив функций сортировки
  323. // void (*sort[7])(int* arr, int len) =
  324. // {
  325. // bubble, bubbleIver1, bubbleIver12, simpleInsert, binaryInsert, countSort, radixSort
  326. // };
  327. // // массив функций генерации
  328. // void (*generate[4])(int* arr, int len) =
  329. // {
  330. // randomRange0To9,randomRange0To10000, almostSorted,sortedFrom10000To1
  331. // };
  332. //
  333. // for (int i = 1000; i < 8001; i += 1000)
  334. // {
  335. // fout << i << ';';
  336. // for (int j = 0; j < 7; ++j)
  337. // {
  338. // for (int k = 0; k < 4; ++k)
  339. // {
  340. // int* arr = new int[i];
  341. // generate[k](arr, i);
  342. // sort[j](arr, i);
  343. // fout << counter << ';';// запись результата подсчета
  344. // delete[] arr;
  345. //
  346. // }
  347. //
  348. // }
  349. // fout << endl;
  350. //
  351. // }
  352. // fout.close();
  353. fstream data("data.txt");
  354. double temp = 0;
  355. data >> temp;
  356. map<double, int> nums;
  357. nums.insert({temp, 1});
  358. do
  359. {
  360. data >> temp;
  361. if (nums.find(temp) == nums.end())
  362. nums.insert({temp, 1});
  363. else
  364. nums.find(temp)->second++;
  365. } while (!data.eof());
  366. double step = 3.325;
  367. int sum = 0;
  368. auto it = nums.begin();
  369. map<string, int> res;
  370. double start = it->first;
  371. for (int i = 0; i < 8; ++i)
  372. {
  373. res.insert({to_string(start) + " - " + to_string(start + step), 0});
  374. while (it->first < start + step)
  375. {
  376. res.find(to_string(start) + " - " + to_string(start + step))->second+=it->second;
  377. it++;
  378. }
  379. start = start + step;
  380. }
  381. for(const pair<string, int>& pair : res)
  382. {
  383. cout << pair.first << " & " << pair.second << " & " << double(pair.second) * 100 /197 << R"(\\ \hline)" << endl;
  384. }
  385. double exp = 0;
  386. for(const pair< double, int>& iter : nums)
  387. {
  388. exp += iter.first * iter.second;
  389. }
  390. exp = exp /197;
  391. double disp = 0;
  392. int i = 0;
  393. cout << endl << exp << endl;
  394. for(const pair< double, int>& iter : nums)
  395. {
  396. if(iter.first == 0)
  397. return 1;
  398. ++i;
  399. disp += (iter.first - exp) * (iter.first - exp) * iter.second;
  400. }
  401. disp = disp/197;
  402. cout << endl << disp << endl << " " << i;
  403. fstream data2("data.txt");
  404. vector<double> vec;
  405. do
  406. {
  407. double temp = 0;
  408. data2 >> temp;
  409. vec.push_back(temp);
  410. }while(!data2.eof());
  411. disp = 0;
  412. i = 0;
  413. for(const double& iter : vec)
  414. {
  415. if(iter == 0)
  416. break;
  417. ++i;
  418. disp += (iter - exp) * (iter - exp);
  419. //cout << iter << endl;
  420. }
  421. disp = disp/197;
  422. cout << endl << disp << endl << " " << i;
  423. return 0;
  424. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement