annotate gecko/src/quicksort.c @ 1:35af401890c0 draft

Uploaded
author bitlab
date Thu, 13 Dec 2018 07:59:25 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
35af401890c0 Uploaded
bitlab
parents:
diff changeset
1 #include <stdio.h>
35af401890c0 Uploaded
bitlab
parents:
diff changeset
2 #include <stdlib.h>
35af401890c0 Uploaded
bitlab
parents:
diff changeset
3 #include <string.h>
35af401890c0 Uploaded
bitlab
parents:
diff changeset
4 #include <pthread.h>
35af401890c0 Uploaded
bitlab
parents:
diff changeset
5 #include <unistd.h>
35af401890c0 Uploaded
bitlab
parents:
diff changeset
6 #include <sys/time.h>
35af401890c0 Uploaded
bitlab
parents:
diff changeset
7 #include <stdint.h>
35af401890c0 Uploaded
bitlab
parents:
diff changeset
8 #include "structs.h"
35af401890c0 Uploaded
bitlab
parents:
diff changeset
9 #include "commonFunctions.h"
35af401890c0 Uploaded
bitlab
parents:
diff changeset
10 #include "quicksort.h"
35af401890c0 Uploaded
bitlab
parents:
diff changeset
11
35af401890c0 Uploaded
bitlab
parents:
diff changeset
12 #define BUF_SIZE 1024
35af401890c0 Uploaded
bitlab
parents:
diff changeset
13 #define SWAP(a,b,t) t=a; a=b; b=t;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
14 #define STRING_SIZE 1024
35af401890c0 Uploaded
bitlab
parents:
diff changeset
15
35af401890c0 Uploaded
bitlab
parents:
diff changeset
16 typedef struct {
35af401890c0 Uploaded
bitlab
parents:
diff changeset
17 BaseType* a;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
18 int l;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
19 int r;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
20 int nth;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
21 } PQSortArgs;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
22
35af401890c0 Uploaded
bitlab
parents:
diff changeset
23 typedef struct {
35af401890c0 Uploaded
bitlab
parents:
diff changeset
24 char fin1[STRING_SIZE];
35af401890c0 Uploaded
bitlab
parents:
diff changeset
25 char fin2[STRING_SIZE];
35af401890c0 Uploaded
bitlab
parents:
diff changeset
26 char fout[STRING_SIZE];
35af401890c0 Uploaded
bitlab
parents:
diff changeset
27 } PMergeArgs;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
28
35af401890c0 Uploaded
bitlab
parents:
diff changeset
29 void assertNotNull(void* p, char* msg){
35af401890c0 Uploaded
bitlab
parents:
diff changeset
30 if(p==NULL){
35af401890c0 Uploaded
bitlab
parents:
diff changeset
31 terror(msg);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
32 }
35af401890c0 Uploaded
bitlab
parents:
diff changeset
33 }
35af401890c0 Uploaded
bitlab
parents:
diff changeset
34
35af401890c0 Uploaded
bitlab
parents:
diff changeset
35 void assertIntEQ(int a, int b, char* msg){
35af401890c0 Uploaded
bitlab
parents:
diff changeset
36 if(a!=b){
35af401890c0 Uploaded
bitlab
parents:
diff changeset
37 terror(msg);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
38 }
35af401890c0 Uploaded
bitlab
parents:
diff changeset
39 }
35af401890c0 Uploaded
bitlab
parents:
diff changeset
40
35af401890c0 Uploaded
bitlab
parents:
diff changeset
41 void assertIntGE(int a, int b, char* msg){
35af401890c0 Uploaded
bitlab
parents:
diff changeset
42 if(a<b){
35af401890c0 Uploaded
bitlab
parents:
diff changeset
43 terror(msg);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
44 }
35af401890c0 Uploaded
bitlab
parents:
diff changeset
45 }
35af401890c0 Uploaded
bitlab
parents:
diff changeset
46
35af401890c0 Uploaded
bitlab
parents:
diff changeset
47 int bufMerge(BaseType* a1, int n1, BaseType* a2, int n2, BaseType* m){
35af401890c0 Uploaded
bitlab
parents:
diff changeset
48 int i1=0,i2=0;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
49 int j=0;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
50
35af401890c0 Uploaded
bitlab
parents:
diff changeset
51 while(i1<n1 && i2<n2){
35af401890c0 Uploaded
bitlab
parents:
diff changeset
52 if(GT(a1[i1],a2[i2])){
35af401890c0 Uploaded
bitlab
parents:
diff changeset
53 m[j]=a2[i2];
35af401890c0 Uploaded
bitlab
parents:
diff changeset
54 i2++;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
55 j++;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
56 }else{
35af401890c0 Uploaded
bitlab
parents:
diff changeset
57 m[j]=a1[i1];
35af401890c0 Uploaded
bitlab
parents:
diff changeset
58 i1++;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
59 j++;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
60 }
35af401890c0 Uploaded
bitlab
parents:
diff changeset
61 }
35af401890c0 Uploaded
bitlab
parents:
diff changeset
62
35af401890c0 Uploaded
bitlab
parents:
diff changeset
63 while(i1<n1){
35af401890c0 Uploaded
bitlab
parents:
diff changeset
64 m[j]=a1[i1];
35af401890c0 Uploaded
bitlab
parents:
diff changeset
65 i1++;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
66 j++;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
67 }
35af401890c0 Uploaded
bitlab
parents:
diff changeset
68
35af401890c0 Uploaded
bitlab
parents:
diff changeset
69 while(i2<n2){
35af401890c0 Uploaded
bitlab
parents:
diff changeset
70 m[j]=a2[i2];
35af401890c0 Uploaded
bitlab
parents:
diff changeset
71 i2++;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
72 j++;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
73 }
35af401890c0 Uploaded
bitlab
parents:
diff changeset
74
35af401890c0 Uploaded
bitlab
parents:
diff changeset
75 return j;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
76 }
35af401890c0 Uploaded
bitlab
parents:
diff changeset
77
35af401890c0 Uploaded
bitlab
parents:
diff changeset
78 void *PMerge(void* a){
35af401890c0 Uploaded
bitlab
parents:
diff changeset
79 PMergeArgs* args = (PMergeArgs*)a;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
80
35af401890c0 Uploaded
bitlab
parents:
diff changeset
81 FILE* fin1 = fopen(args->fin1,"rb");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
82 assertNotNull(fin1,args->fin1);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
83
35af401890c0 Uploaded
bitlab
parents:
diff changeset
84 FILE* fin2 = fopen(args->fin2,"rb");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
85 assertNotNull(fin2,args->fin2);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
86
35af401890c0 Uploaded
bitlab
parents:
diff changeset
87 FILE* fout = fopen(args->fout,"wb");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
88 assertNotNull(fout,args->fout);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
89
35af401890c0 Uploaded
bitlab
parents:
diff changeset
90 BaseType *a1 = (BaseType*)calloc(BUF_SIZE,sizeof(BaseType));
35af401890c0 Uploaded
bitlab
parents:
diff changeset
91 assertNotNull(a1,"calloc");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
92
35af401890c0 Uploaded
bitlab
parents:
diff changeset
93 BaseType *a2 = (BaseType*)calloc(BUF_SIZE,sizeof(BaseType));
35af401890c0 Uploaded
bitlab
parents:
diff changeset
94 assertNotNull(a2,"calloc");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
95
35af401890c0 Uploaded
bitlab
parents:
diff changeset
96 BaseType *m = (BaseType*)calloc(2*BUF_SIZE,sizeof(BaseType));
35af401890c0 Uploaded
bitlab
parents:
diff changeset
97 assertNotNull(m,"calloc");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
98
35af401890c0 Uploaded
bitlab
parents:
diff changeset
99 int i,j,k;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
100 int r1,r2,tmp;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
101
35af401890c0 Uploaded
bitlab
parents:
diff changeset
102 r1=fread(a1,sizeof(BaseType),BUF_SIZE,fin1);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
103 r2=fread(a2,sizeof(BaseType),BUF_SIZE,fin2);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
104
35af401890c0 Uploaded
bitlab
parents:
diff changeset
105 i=j=k=0;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
106 while(r1>0 && r2>0){
35af401890c0 Uploaded
bitlab
parents:
diff changeset
107 while(i<r1 && j<r2){
35af401890c0 Uploaded
bitlab
parents:
diff changeset
108 if(GT(a1[i],a2[j])){
35af401890c0 Uploaded
bitlab
parents:
diff changeset
109 m[k]=a2[j];
35af401890c0 Uploaded
bitlab
parents:
diff changeset
110 j++;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
111 }else{
35af401890c0 Uploaded
bitlab
parents:
diff changeset
112 m[k]=a1[i];
35af401890c0 Uploaded
bitlab
parents:
diff changeset
113 i++;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
114 }
35af401890c0 Uploaded
bitlab
parents:
diff changeset
115 k++;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
116 if(k>=2*BUF_SIZE){
35af401890c0 Uploaded
bitlab
parents:
diff changeset
117 tmp=fwrite(m,sizeof(BaseType),k,fout);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
118 assertIntEQ(tmp,k,"fwrite");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
119 k=0;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
120 }
35af401890c0 Uploaded
bitlab
parents:
diff changeset
121 }
35af401890c0 Uploaded
bitlab
parents:
diff changeset
122
35af401890c0 Uploaded
bitlab
parents:
diff changeset
123 if(i>=r1){
35af401890c0 Uploaded
bitlab
parents:
diff changeset
124 r1=fread(a1,sizeof(BaseType),BUF_SIZE,fin1);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
125 i=0;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
126 }
35af401890c0 Uploaded
bitlab
parents:
diff changeset
127
35af401890c0 Uploaded
bitlab
parents:
diff changeset
128 if(j>=r2){
35af401890c0 Uploaded
bitlab
parents:
diff changeset
129 r2=fread(a2,sizeof(BaseType),BUF_SIZE,fin2);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
130 j=0;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
131 }
35af401890c0 Uploaded
bitlab
parents:
diff changeset
132 }
35af401890c0 Uploaded
bitlab
parents:
diff changeset
133
35af401890c0 Uploaded
bitlab
parents:
diff changeset
134 if(k>0){
35af401890c0 Uploaded
bitlab
parents:
diff changeset
135 tmp=fwrite(m,sizeof(BaseType),k,fout);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
136 assertIntEQ(tmp,k,"fwrite");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
137 }
35af401890c0 Uploaded
bitlab
parents:
diff changeset
138
35af401890c0 Uploaded
bitlab
parents:
diff changeset
139 if(i<r1){
35af401890c0 Uploaded
bitlab
parents:
diff changeset
140 tmp=fwrite(a1+i,sizeof(BaseType),r1-i,fout);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
141 assertIntEQ(tmp,r1-i,"fwrite");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
142 }
35af401890c0 Uploaded
bitlab
parents:
diff changeset
143
35af401890c0 Uploaded
bitlab
parents:
diff changeset
144 if(j<r2){
35af401890c0 Uploaded
bitlab
parents:
diff changeset
145 tmp=fwrite(a2+j,sizeof(BaseType),r2-j,fout);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
146 assertIntEQ(tmp,r2-j,"fwrite");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
147 }
35af401890c0 Uploaded
bitlab
parents:
diff changeset
148
35af401890c0 Uploaded
bitlab
parents:
diff changeset
149 assertIntEQ(fclose(fin1),0,"fclose");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
150 assertIntEQ(fclose(fin2),0,"fclose");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
151 assertIntEQ(fclose(fout),0,"fclose");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
152
35af401890c0 Uploaded
bitlab
parents:
diff changeset
153 assertIntEQ(unlink(args->fin1),0,args->fin1);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
154 assertIntEQ(unlink(args->fin2),0,args->fin2);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
155
35af401890c0 Uploaded
bitlab
parents:
diff changeset
156 pthread_exit(NULL);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
157 }
35af401890c0 Uploaded
bitlab
parents:
diff changeset
158
35af401890c0 Uploaded
bitlab
parents:
diff changeset
159 int partition(BaseType* a, int l, int r) {
35af401890c0 Uploaded
bitlab
parents:
diff changeset
160 int i=l;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
161 int j=r+1;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
162 BaseType t;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
163
35af401890c0 Uploaded
bitlab
parents:
diff changeset
164 // l sera el pivote
35af401890c0 Uploaded
bitlab
parents:
diff changeset
165 // y contendra la mediana de l, r y (l+r)/2
35af401890c0 Uploaded
bitlab
parents:
diff changeset
166 int mid = (l+r)/2;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
167
35af401890c0 Uploaded
bitlab
parents:
diff changeset
168 if(GT(a[mid],a[r])) {
35af401890c0 Uploaded
bitlab
parents:
diff changeset
169 SWAP(a[mid],a[r],t);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
170 }
35af401890c0 Uploaded
bitlab
parents:
diff changeset
171
35af401890c0 Uploaded
bitlab
parents:
diff changeset
172 if(GT(a[mid],a[l])) {
35af401890c0 Uploaded
bitlab
parents:
diff changeset
173 SWAP(a[mid],a[l],t);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
174 }
35af401890c0 Uploaded
bitlab
parents:
diff changeset
175
35af401890c0 Uploaded
bitlab
parents:
diff changeset
176 if(GT(a[l],a[r])) {
35af401890c0 Uploaded
bitlab
parents:
diff changeset
177 SWAP(a[l],a[r],t);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
178 }
35af401890c0 Uploaded
bitlab
parents:
diff changeset
179
35af401890c0 Uploaded
bitlab
parents:
diff changeset
180 while (1) {
35af401890c0 Uploaded
bitlab
parents:
diff changeset
181 do{
35af401890c0 Uploaded
bitlab
parents:
diff changeset
182 ++i;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
183 }while( !GT(a[i],a[l]) && i <= r );
35af401890c0 Uploaded
bitlab
parents:
diff changeset
184
35af401890c0 Uploaded
bitlab
parents:
diff changeset
185 do{
35af401890c0 Uploaded
bitlab
parents:
diff changeset
186 --j;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
187 }while( GT(a[j],a[l]) && j >= l);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
188
35af401890c0 Uploaded
bitlab
parents:
diff changeset
189 if( i >= j ) break;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
190
35af401890c0 Uploaded
bitlab
parents:
diff changeset
191 SWAP(a[i],a[j],t)
35af401890c0 Uploaded
bitlab
parents:
diff changeset
192 }
35af401890c0 Uploaded
bitlab
parents:
diff changeset
193
35af401890c0 Uploaded
bitlab
parents:
diff changeset
194 SWAP(a[l],a[j],t)
35af401890c0 Uploaded
bitlab
parents:
diff changeset
195
35af401890c0 Uploaded
bitlab
parents:
diff changeset
196 return j;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
197 }
35af401890c0 Uploaded
bitlab
parents:
diff changeset
198
35af401890c0 Uploaded
bitlab
parents:
diff changeset
199 int QsortC(BaseType* a, int l,int r) {
35af401890c0 Uploaded
bitlab
parents:
diff changeset
200 int j;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
201
35af401890c0 Uploaded
bitlab
parents:
diff changeset
202 if( l < r ) {
35af401890c0 Uploaded
bitlab
parents:
diff changeset
203 // divide and conquer
35af401890c0 Uploaded
bitlab
parents:
diff changeset
204 j = partition( a, l, r);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
205 // j=(l+r)/2;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
206 QsortC( a, l, j-1);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
207 QsortC( a, j+1, r);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
208 }
35af401890c0 Uploaded
bitlab
parents:
diff changeset
209 return 0;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
210 }
35af401890c0 Uploaded
bitlab
parents:
diff changeset
211
35af401890c0 Uploaded
bitlab
parents:
diff changeset
212 void *PQSort(void* a){
35af401890c0 Uploaded
bitlab
parents:
diff changeset
213 PQSortArgs *args=(PQSortArgs*)a;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
214 if(args->nth>1){
35af401890c0 Uploaded
bitlab
parents:
diff changeset
215 int tmp;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
216 int j = partition(args->a,args->l,args->r);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
217 int np=1;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
218 if(args->r - args->l > 0)
35af401890c0 Uploaded
bitlab
parents:
diff changeset
219 np = (args->nth*(j-args->l))/(args->r-args->l);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
220 if(np<1) np=1;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
221 if(np>=args->nth) np=args->nth-1;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
222 //printf("%d\t%d (%d)\t%d (%d)\n",args->r-args->l,j-args->l,np,args->r-j,args->nth-np);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
223
35af401890c0 Uploaded
bitlab
parents:
diff changeset
224 pthread_t* th = (pthread_t*)calloc(2,sizeof(pthread_t));
35af401890c0 Uploaded
bitlab
parents:
diff changeset
225 assertNotNull(th,"calloc");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
226
35af401890c0 Uploaded
bitlab
parents:
diff changeset
227 PQSortArgs* nargs = (PQSortArgs*)calloc(2,sizeof(PQSortArgs));
35af401890c0 Uploaded
bitlab
parents:
diff changeset
228 assertNotNull(args,"calloc");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
229
35af401890c0 Uploaded
bitlab
parents:
diff changeset
230 nargs[0].a=args->a;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
231 nargs[0].l=args->l;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
232 nargs[0].r=j-1;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
233 nargs[0].nth=np;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
234 tmp=pthread_create(th,NULL,PQSort,(void*)(nargs));
35af401890c0 Uploaded
bitlab
parents:
diff changeset
235 assertIntEQ(tmp,0,"pthread_create");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
236
35af401890c0 Uploaded
bitlab
parents:
diff changeset
237 nargs[1].a=args->a;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
238 nargs[1].l=j+1;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
239 nargs[1].r=args->r;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
240 nargs[1].nth=args->nth-np;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
241 tmp=pthread_create(th+1,NULL,PQSort,(void*)(nargs+1));
35af401890c0 Uploaded
bitlab
parents:
diff changeset
242 assertIntEQ(tmp,0,"pthread_create");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
243
35af401890c0 Uploaded
bitlab
parents:
diff changeset
244 tmp=pthread_join(th[0],NULL);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
245 assertIntEQ(tmp,0,"pthread_join");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
246 tmp=pthread_join(th[1],NULL);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
247 assertIntEQ(tmp,0,"pthread_join");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
248
35af401890c0 Uploaded
bitlab
parents:
diff changeset
249 free(th);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
250 free(nargs);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
251 }else{
35af401890c0 Uploaded
bitlab
parents:
diff changeset
252 QsortC(args->a,args->l,args->r);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
253 }
35af401890c0 Uploaded
bitlab
parents:
diff changeset
254 pthread_exit(NULL);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
255 }
35af401890c0 Uploaded
bitlab
parents:
diff changeset
256
35af401890c0 Uploaded
bitlab
parents:
diff changeset
257 unsigned long timestart(){
35af401890c0 Uploaded
bitlab
parents:
diff changeset
258 struct timeval tv;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
259
35af401890c0 Uploaded
bitlab
parents:
diff changeset
260 gettimeofday(&tv,NULL);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
261
35af401890c0 Uploaded
bitlab
parents:
diff changeset
262 return (tv.tv_usec/1000) + (tv.tv_sec*1000);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
263 }
35af401890c0 Uploaded
bitlab
parents:
diff changeset
264
35af401890c0 Uploaded
bitlab
parents:
diff changeset
265 unsigned long timestop(unsigned long start){
35af401890c0 Uploaded
bitlab
parents:
diff changeset
266 struct timeval tv;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
267
35af401890c0 Uploaded
bitlab
parents:
diff changeset
268 gettimeofday(&tv,NULL);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
269
35af401890c0 Uploaded
bitlab
parents:
diff changeset
270 return (tv.tv_usec/1000) + (tv.tv_sec*1000) - start;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
271 }
35af401890c0 Uploaded
bitlab
parents:
diff changeset
272
35af401890c0 Uploaded
bitlab
parents:
diff changeset
273 int psort(int maxsize, int nproc, char* ifile, char* ofile){
35af401890c0 Uploaded
bitlab
parents:
diff changeset
274 int tmp;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
275 int max=maxsize;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
276 int np=nproc;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
277 if(np<1) np=1;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
278
35af401890c0 Uploaded
bitlab
parents:
diff changeset
279 printf("Allocating %lu bytes.\n",max*sizeof(BaseType));
35af401890c0 Uploaded
bitlab
parents:
diff changeset
280 BaseType* a = (BaseType*)calloc(max,sizeof(BaseType));
35af401890c0 Uploaded
bitlab
parents:
diff changeset
281 assertNotNull(a,"calloc");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
282
35af401890c0 Uploaded
bitlab
parents:
diff changeset
283 FILE* fin=fopen(ifile,"rt");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
284 assertNotNull(fin,ifile);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
285
35af401890c0 Uploaded
bitlab
parents:
diff changeset
286 printf("Stage1: Quicksorts\n");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
287 unsigned long t = timestart();
35af401890c0 Uploaded
bitlab
parents:
diff changeset
288 //Read + Quicksort + Write:
35af401890c0 Uploaded
bitlab
parents:
diff changeset
289 char fname[strlen(ofile)+10];
35af401890c0 Uploaded
bitlab
parents:
diff changeset
290 int nfile=0;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
291
35af401890c0 Uploaded
bitlab
parents:
diff changeset
292 do {
35af401890c0 Uploaded
bitlab
parents:
diff changeset
293 //Read:
35af401890c0 Uploaded
bitlab
parents:
diff changeset
294 // printf("Reading...\n");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
295 int n=fread(a,sizeof(BaseType),max,fin);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
296 if(n==0) break;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
297
35af401890c0 Uploaded
bitlab
parents:
diff changeset
298 //Quicksort:
35af401890c0 Uploaded
bitlab
parents:
diff changeset
299 // printf("Quicksort %d\n",n);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
300 pthread_t th;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
301 PQSortArgs args;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
302
35af401890c0 Uploaded
bitlab
parents:
diff changeset
303 args.a=a;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
304 args.l=0;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
305 args.r=n-1;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
306 args.nth=np;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
307 tmp=pthread_create(&th,NULL,PQSort,(void*)(&args));
35af401890c0 Uploaded
bitlab
parents:
diff changeset
308 assertIntEQ(tmp,0,"pthread_create");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
309
35af401890c0 Uploaded
bitlab
parents:
diff changeset
310 //Wait:
35af401890c0 Uploaded
bitlab
parents:
diff changeset
311 tmp=pthread_join(th,NULL);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
312 assertIntEQ(tmp,0,"pthread_join");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
313
35af401890c0 Uploaded
bitlab
parents:
diff changeset
314 //Write:
35af401890c0 Uploaded
bitlab
parents:
diff changeset
315 // printf("Writing...\n");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
316 sprintf(fname,"%s.%06d",ofile,nfile);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
317 FILE* fout=fopen(fname,"wb");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
318 assertNotNull(fout,"fname");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
319
35af401890c0 Uploaded
bitlab
parents:
diff changeset
320 tmp=fwrite(a,sizeof(BaseType),n,fout);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
321 assertIntEQ(tmp,n,"fwrite");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
322
35af401890c0 Uploaded
bitlab
parents:
diff changeset
323 tmp=fclose(fout);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
324 assertIntEQ(tmp,0,"fclose");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
325
35af401890c0 Uploaded
bitlab
parents:
diff changeset
326 nfile++;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
327 }while(!feof(fin));
35af401890c0 Uploaded
bitlab
parents:
diff changeset
328
35af401890c0 Uploaded
bitlab
parents:
diff changeset
329 tmp=fclose(fin);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
330 assertIntEQ(tmp,0,"fclose");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
331
35af401890c0 Uploaded
bitlab
parents:
diff changeset
332 free(a);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
333
35af401890c0 Uploaded
bitlab
parents:
diff changeset
334 tmp=unlink(ifile);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
335 assertIntEQ(tmp,0,"unlink");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
336
35af401890c0 Uploaded
bitlab
parents:
diff changeset
337 printf("Stage1: %lu\n\n",timestop(t));
35af401890c0 Uploaded
bitlab
parents:
diff changeset
338
35af401890c0 Uploaded
bitlab
parents:
diff changeset
339 //Merge:
35af401890c0 Uploaded
bitlab
parents:
diff changeset
340 printf("Stage2: Merge\n");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
341 t = timestart();
35af401890c0 Uploaded
bitlab
parents:
diff changeset
342
35af401890c0 Uploaded
bitlab
parents:
diff changeset
343 int curf=0;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
344 int i=0;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
345 int j=0;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
346 pthread_t th[np];
35af401890c0 Uploaded
bitlab
parents:
diff changeset
347 PMergeArgs args[np];
35af401890c0 Uploaded
bitlab
parents:
diff changeset
348
35af401890c0 Uploaded
bitlab
parents:
diff changeset
349 curf=0;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
350 while(nfile-curf>1){
35af401890c0 Uploaded
bitlab
parents:
diff changeset
351 j=0;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
352 while(curf<nfile-1 && j<np){
35af401890c0 Uploaded
bitlab
parents:
diff changeset
353 sprintf(args[j].fin1,"%s.%06d",ofile,curf);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
354 sprintf(args[j].fin2,"%s.%06d",ofile,curf+1);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
355 sprintf(args[j].fout,"%s.%06d",ofile,nfile+j);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
356
35af401890c0 Uploaded
bitlab
parents:
diff changeset
357 // printf("Merge(%d, %d) -> %d\n",curf,curf+1,nfile+j);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
358 tmp=pthread_create(th+j,NULL,PMerge,(void*)(args+j));
35af401890c0 Uploaded
bitlab
parents:
diff changeset
359 assertIntEQ(tmp,0,"pthread_create");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
360 curf+=2;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
361 j++;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
362 }
35af401890c0 Uploaded
bitlab
parents:
diff changeset
363
35af401890c0 Uploaded
bitlab
parents:
diff changeset
364 for(i=0;i<j;i++){
35af401890c0 Uploaded
bitlab
parents:
diff changeset
365 tmp=pthread_join(th[i],NULL);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
366 assertIntEQ(tmp,0,"pthread_join");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
367 }
35af401890c0 Uploaded
bitlab
parents:
diff changeset
368
35af401890c0 Uploaded
bitlab
parents:
diff changeset
369 nfile+=j;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
370 }
35af401890c0 Uploaded
bitlab
parents:
diff changeset
371
35af401890c0 Uploaded
bitlab
parents:
diff changeset
372 printf("Stage2: %lu\n\n",timestop(t));
35af401890c0 Uploaded
bitlab
parents:
diff changeset
373
35af401890c0 Uploaded
bitlab
parents:
diff changeset
374 //Bin2Text:
35af401890c0 Uploaded
bitlab
parents:
diff changeset
375 printf("Stage3: Write output file\n");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
376 t = timestart();
35af401890c0 Uploaded
bitlab
parents:
diff changeset
377
35af401890c0 Uploaded
bitlab
parents:
diff changeset
378 sprintf(fname,"%s.%06d",ofile,curf);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
379 if(nfile>0){
35af401890c0 Uploaded
bitlab
parents:
diff changeset
380 tmp=rename(fname,ofile);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
381 assertIntEQ(tmp,0,"rename");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
382 } else {
35af401890c0 Uploaded
bitlab
parents:
diff changeset
383 FILE *fout=fopen(ofile, "wb");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
384 assertNotNull(fout,"fopen");
35af401890c0 Uploaded
bitlab
parents:
diff changeset
385 fclose(fout);
35af401890c0 Uploaded
bitlab
parents:
diff changeset
386 }
35af401890c0 Uploaded
bitlab
parents:
diff changeset
387
35af401890c0 Uploaded
bitlab
parents:
diff changeset
388 printf("Stage3: %lu\n",timestop(t));
35af401890c0 Uploaded
bitlab
parents:
diff changeset
389
35af401890c0 Uploaded
bitlab
parents:
diff changeset
390 return 0;
35af401890c0 Uploaded
bitlab
parents:
diff changeset
391
35af401890c0 Uploaded
bitlab
parents:
diff changeset
392 }