Advertisement
Guest User

Untitled

a guest
Nov 28th, 2015
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.86 KB | None | 0 0
  1. #define _CRT_SECURE_NO_DEPRECATE
  2. #include <iostream>
  3. #include <stdio.h>
  4. #include <iostream>
  5. #include <ctime>
  6. #include <math.h>
  7. #define bittype unsigned __int64
  8. bittype N=15;//Количество строк исходной матрицы
  9. //int L=3;//Количество столбцов исходной матрицы
  10. //bittype BLOCKL=513;//размер блока
  11. //int BLOCKN=513;
  12. //const bool isPrinting=true;//вывод промежуточных и итоговых результатов(при true выводит исходную, результирующую и промежуточные блочные)
  13. //const bool isCreatingMatrix=true;//для создания матрицы где целая часть это число до запятой а столбец число после запятой для проверки
  14. ////исходная матрица будет лежать(или стоит положить и сделать поле isCreatingMatrix=false) в бинарном виде в matrix.bin
  15. ////транспонированная матрица лежит в бинарном виде в matrixt.bin
  16.  
  17. void CreateRandom(const char* name)
  18. {
  19. FILE * pFile;
  20. pFile = fopen ( name , "wb" );
  21. fwrite(&N,sizeof(bittype),1,pFile);
  22. for(int j=0;j<N;j++)
  23. {
  24.  
  25. bittype t=bittype(rand()%100+48);
  26. bittype i=t;
  27. if(j==0)
  28. i=pow(2,59);
  29. fwrite(&i,sizeof(bittype),1,pFile);
  30.  
  31. }
  32. fclose(pFile
  33. );
  34. }
  35. const int BLOCK=60000;
  36. int Block;
  37. void merge()
  38. {
  39. bittype N1,N2,N3;
  40. FILE *in1;
  41. in1 = fopen ("in.bin" , "rb" );
  42. FILE *in2;
  43. in2 = fopen ( "output.bin" , "rb" );
  44. FILE *output;
  45. output = fopen ( "out.bin" , "wb" );
  46. fread(&N1,sizeof(bittype),1,in1);
  47. fread(&N2,sizeof(bittype),1,in2);
  48. N3=N1+N2;
  49. fwrite(&N3,sizeof(bittype),1,output);
  50. bittype * Mass1=new bittype[Block];
  51. bittype * Mass2=new bittype[Block];
  52. bittype * Mass3=new bittype[Block];
  53. int i1=0,i2=0,i3=0;
  54. int result1=0,result2=0;
  55. bool end1=true,end2=true;
  56. while(true)
  57. {
  58. if((i1==result1) && (end1) )
  59. {
  60. result1 = fread(Mass1,sizeof(bittype),Block,in1);
  61. i1=0;
  62. if(result1 ==0)
  63. end1=false;
  64. }
  65. if((i2==result2) && (end2))
  66. {
  67. result2 = fread(Mass2,sizeof(bittype),Block,in2);
  68. i2=0;
  69. if(result2 ==0)
  70. end2=false;
  71. }
  72. if((!end1) && (!end2))
  73. break;
  74. if(!end1 || !end2)
  75. {
  76. if(end1)
  77. {
  78. Mass3[i3]=Mass1[i1];
  79. i1++;
  80. }
  81. if(end2)
  82. {
  83. Mass3[i3]=Mass2[i2];
  84. i2++;
  85. }
  86. }
  87. else
  88. {
  89. if(Mass1[i1]<Mass2[i2])
  90. {
  91. Mass3[i3]=Mass1[i1];
  92. i1++;
  93.  
  94. }
  95. else
  96. {
  97. Mass3[i3]=Mass2[i2];
  98.  
  99. i2++;
  100. }
  101. }
  102. //std::cout<<Mass3[i3]<<" ";
  103. i3++;
  104. if(i3==Block)
  105. {
  106. fwrite(Mass3,sizeof(bittype),Block,output);
  107. //std::cout<<"\n";
  108. i3=0;
  109. }
  110. }
  111. if(i3!=0)
  112. {
  113. fwrite(Mass3,sizeof(bittype),i3,output);
  114. }
  115. delete Mass1;
  116. delete Mass2;
  117. delete Mass3;
  118. fclose(in1
  119. );
  120. fclose(in2
  121. );
  122. fclose(output
  123. );
  124. remove("in.bin");
  125. remove("output.bin");
  126. rename("out.bin","output.bin");
  127. }
  128. void PrinFile(const char* name)
  129. {
  130. FILE *input;
  131. bittype L;
  132. input = fopen ( name , "rb" );
  133. fread(&L,sizeof(bittype),1,input);
  134. std::cout<<L<<" :";
  135. bittype *M=new bittype[L];
  136. long result=fread(M,sizeof(bittype),L*2,input);
  137. for(int i=0;i<result;i+=1)
  138. {
  139. std::cout<<M[i]<<" ";
  140. }
  141. std::cout<<"\n"<<std::endl;
  142. fclose(input
  143. );
  144. }
  145. int compare(const void * x1, const void * x2) // функция сравнения элементов массива
  146. {
  147. //__int128 t = ( *(bittype*)x1 - *(bittype*)x2 );
  148. if(*(bittype*)x1>*(bittype*)x2)
  149. return 1;
  150. if(*(bittype*)x1<*(bittype*)x2)
  151. return -1;
  152. return 0; // если результат вычитания равен 0, то числа равны, < 0: x1 < x2; > 0: x1 > x2
  153. }
  154. void Sort()
  155. {
  156. bittype N1;
  157. FILE *input;
  158. input = fopen ( "input.bin" , "rb" );
  159. FILE *output,*temp;
  160. output = fopen ( "output.bin" , "wb" );
  161.  
  162. fread(&N1,sizeof(bittype),1,input);
  163. bittype* Mass=new bittype[BLOCK];
  164. long result=fread(Mass,8,BLOCK,input);
  165. bittype res=result;
  166. qsort(Mass, result, sizeof(bittype), compare);
  167. //for(int i=0;i<result;i+=1)
  168. //{
  169. // std::cout<<Mass[i]<<" ";
  170. //}
  171. //std::cout<<"\n";
  172. fwrite(&res,8,1,output);
  173. fwrite(Mass,8,result,output);
  174. fclose(output);
  175. delete Mass;
  176. for(int i=0;i<N1;i+=BLOCK)
  177. {
  178. Mass=new bittype[BLOCK];
  179. //fseek(input,i*8+8,SEEK_SET);
  180. result=fread(Mass,sizeof(bittype),BLOCK,input);
  181. if(result==0)
  182. break;
  183. temp=fopen ( "in.bin" , "wb" );
  184. res=result;
  185. qsort(Mass, result, sizeof(bittype), compare);
  186. fwrite(&res,sizeof(bittype),1,output);
  187. fwrite(Mass,sizeof(bittype),result,temp);
  188. fclose(temp);
  189. delete Mass;
  190. merge();
  191. }
  192. fclose(input);
  193. }
  194. void main()
  195. {
  196. Block=BLOCK/3;
  197. //std::cout<< sizeof(bittype);
  198. //qsort(vector, Block, sizeof(bittype), compare);
  199. //srand( time( 0 ) );
  200.  
  201. //CreateRandom("input.bin");
  202. //clock_t start=clock();
  203. //PrinFile("input.bin");
  204. //clock_t start=clock();
  205. Sort();
  206.  
  207. //std::cout<<(clock()-start)/CLOCKS_PER_SEC<<"\n";
  208. //PrinFile("output.bin");
  209. system("pause");
  210. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement