#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <process.h>
void merge(int L[], int left_count, int R[], int right_count, int out[])
{
int left_iter = 0, right_iter = 0, out_iter = 0;
while(left_iter < left_count && right_iter < right_count)
{
if(L[left_iter] <= R[right_iter])
out[out_iter] = L[left_iter++];
else
out[out_iter] = R[right_iter++];
out_iter++;
}
// Process the rest of elements
if(left_iter == left_count)
while (out_iter < (left_count + right_count))
out[out_iter++] = R[right_iter++];
else
while (out_iter < (left_count + right_count))
out[out_iter++] = L[left_iter++];
}
void mergesort(int a[], int n)
{
int i;
int split = n / 2;
int *L
= malloc(split
* sizeof(int)); int *R
= malloc((n
- split
) * sizeof(int));
if(n > 1)
{
for(i = 0; i < split; i++)
L[i] = a[i];
for(i = split; i < n; i++)
R[i - split] = a[i];
mergesort(L, split);
mergesort(R, n - split);
merge(L, split, R, n - split, a);
}
}
struct ThreadData
{
int *array;
int length;
};
DWORD WINAPI mergesort_parallel(LPVOID *data)
{
int i = 0, length = 0, split = 0;
HANDLE hThreadLeft, hThreadRight;
length = ((struct ThreadData *)data)->length;
split = length / 2;
int *L
= malloc(split
* sizeof(int)); int *R
= malloc((length
- split
) * sizeof(int));
if(length > 1)
{
for(i = 0; i < split; i++)
L[i] = ((struct ThreadData *)data)->array[i];
for(i = split; i < length; i++)
R[i - split] = ((struct ThreadData *)data)->array[i];
struct ThreadData thread_L = { L, split };
struct ThreadData thread_R = { R, length - split };
hThreadLeft = (HANDLE)_beginthreadex(NULL, 0, &mergesort_parallel,
(void *)&thread_L, 0, NULL);
hThreadRight = (HANDLE)_beginthreadex(NULL, 0, &mergesort_parallel,
(void *)&thread_L, 0, NULL);
WaitForSingleObject(hThreadLeft, INFINITE);
WaitForSingleObject(hThreadRight, INFINITE);
merge(L, split, R, length - split, ((struct ThreadData *)data)->array);
CloseHandle(hThreadLeft);
CloseHandle(hThreadRight);
}
return 0;
}
int main(int argc, char *argv[]){
int i;
DWORD ticks = 0;
const int size = 100000;
int v[size]; /*= {1, 3, 5, 7, 9, 2, 4, 6, 8, 10};*/
for (i = 0; i < size; ++i)
v[i] = i % 11;
/*printf("Source array:\n");
for(i = 0; i < size; i++)
printf("%d ", v[i]);
putchar('\n');*/
struct ThreadData td = { (int *)&v, size };
ticks = GetTickCount();
//mergesort(v, size);
mergesort_parallel((void *)&td);
printf("Time elapsed: %d millis\n", GetTickCount
() - ticks
);
/*printf("Sorted array:\n");
for(i = 0; i < size; i++)
printf("%d ", v[i]);*/
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8d2luZG93cy5oPgojaW5jbHVkZSA8cHJvY2Vzcy5oPgoKdm9pZCBtZXJnZShpbnQgTFtdLCBpbnQgbGVmdF9jb3VudCwgaW50IFJbXSwgaW50IHJpZ2h0X2NvdW50LCBpbnQgb3V0W10pCnsKCWludCBsZWZ0X2l0ZXIgPSAwLCByaWdodF9pdGVyID0gMCwgb3V0X2l0ZXIgPSAwOwoKCXdoaWxlKGxlZnRfaXRlciA8IGxlZnRfY291bnQgJiYgcmlnaHRfaXRlciA8IHJpZ2h0X2NvdW50KQoJewoJCWlmKExbbGVmdF9pdGVyXSA8PSBSW3JpZ2h0X2l0ZXJdKQoJCQlvdXRbb3V0X2l0ZXJdID0gTFtsZWZ0X2l0ZXIrK107CgkJZWxzZQoJCQlvdXRbb3V0X2l0ZXJdID0gUltyaWdodF9pdGVyKytdOwoJCW91dF9pdGVyKys7Cgl9CgoJLy8gUHJvY2VzcyB0aGUgcmVzdCBvZiBlbGVtZW50cwoJaWYobGVmdF9pdGVyID09IGxlZnRfY291bnQpCgkJd2hpbGUgKG91dF9pdGVyIDwgKGxlZnRfY291bnQgKyByaWdodF9jb3VudCkpCgkJCW91dFtvdXRfaXRlcisrXSA9IFJbcmlnaHRfaXRlcisrXTsKCWVsc2UKCQl3aGlsZSAob3V0X2l0ZXIgPCAobGVmdF9jb3VudCArIHJpZ2h0X2NvdW50KSkKCQkJb3V0W291dF9pdGVyKytdID0gTFtsZWZ0X2l0ZXIrK107Cn0KCnZvaWQgbWVyZ2Vzb3J0KGludCBhW10sIGludCBuKQp7CglpbnQgaTsKCWludCBzcGxpdCA9IG4gLyAyOwoJaW50ICpMID0gbWFsbG9jKHNwbGl0ICogc2l6ZW9mKGludCkpOwoJaW50ICpSID0gbWFsbG9jKChuIC0gc3BsaXQpICogc2l6ZW9mKGludCkpOwoKCWlmKG4gPiAxKQoJewoJCWZvcihpID0gMDsgaSA8IHNwbGl0OyBpKyspCgkJCUxbaV0gPSBhW2ldOwoJCWZvcihpID0gc3BsaXQ7IGkgPCBuOyBpKyspCgkJCVJbaSAtIHNwbGl0XSA9IGFbaV07CgkJbWVyZ2Vzb3J0KEwsIHNwbGl0KTsKCQltZXJnZXNvcnQoUiwgbiAtIHNwbGl0KTsKCQltZXJnZShMLCBzcGxpdCwgUiwgbiAtIHNwbGl0LCBhKTsKCX0KCWZyZWUoTCk7CglmcmVlKFIpOwp9CgpzdHJ1Y3QgVGhyZWFkRGF0YQp7CglpbnQgICphcnJheTsKCWludCAgIGxlbmd0aDsKfTsKCkRXT1JEIFdJTkFQSSBtZXJnZXNvcnRfcGFyYWxsZWwoTFBWT0lEICpkYXRhKQp7CglpbnQgaSA9IDAsIGxlbmd0aCA9IDAsIHNwbGl0ID0gMDsKCUhBTkRMRSBoVGhyZWFkTGVmdCwgaFRocmVhZFJpZ2h0OwoKCWxlbmd0aCA9ICgoc3RydWN0IFRocmVhZERhdGEgKilkYXRhKS0+bGVuZ3RoOwoJc3BsaXQgID0gbGVuZ3RoIC8gMjsKCWludCAqTCA9IG1hbGxvYyhzcGxpdCAqIHNpemVvZihpbnQpKTsKCWludCAqUiA9IG1hbGxvYygobGVuZ3RoIC0gc3BsaXQpICogc2l6ZW9mKGludCkpOwoKCWlmKGxlbmd0aCA+IDEpCgl7CgkJZm9yKGkgPSAwOyBpIDwgc3BsaXQ7IGkrKykKCQkJTFtpXQkJID0gKChzdHJ1Y3QgVGhyZWFkRGF0YSAqKWRhdGEpLT5hcnJheVtpXTsKCQlmb3IoaSA9IHNwbGl0OyBpIDwgbGVuZ3RoOyBpKyspCgkJCVJbaSAtIHNwbGl0XSA9ICgoc3RydWN0IFRocmVhZERhdGEgKilkYXRhKS0+YXJyYXlbaV07CgoJCXN0cnVjdCBUaHJlYWREYXRhIHRocmVhZF9MID0geyBMLCBzcGxpdCB9OwoJCXN0cnVjdCBUaHJlYWREYXRhIHRocmVhZF9SID0geyBSLCBsZW5ndGggLSBzcGxpdCB9OwoKCQloVGhyZWFkTGVmdCAgPSAoSEFORExFKV9iZWdpbnRocmVhZGV4KE5VTEwsIDAsICZtZXJnZXNvcnRfcGFyYWxsZWwsCgkJCQkJCQkJCQkJICAodm9pZCAqKSZ0aHJlYWRfTCwgMCwgTlVMTCk7CgkJaFRocmVhZFJpZ2h0ID0gKEhBTkRMRSlfYmVnaW50aHJlYWRleChOVUxMLCAwLCAmbWVyZ2Vzb3J0X3BhcmFsbGVsLAoJCQkJCQkJCQkJCSAgKHZvaWQgKikmdGhyZWFkX0wsIDAsIE5VTEwpOwoJCVdhaXRGb3JTaW5nbGVPYmplY3QoaFRocmVhZExlZnQsIElORklOSVRFKTsKCQlXYWl0Rm9yU2luZ2xlT2JqZWN0KGhUaHJlYWRSaWdodCwgSU5GSU5JVEUpOwoKCQltZXJnZShMLCBzcGxpdCwgUiwgbGVuZ3RoIC0gc3BsaXQsICgoc3RydWN0IFRocmVhZERhdGEgKilkYXRhKS0+YXJyYXkpOwoKCQlDbG9zZUhhbmRsZShoVGhyZWFkTGVmdCk7CgkJQ2xvc2VIYW5kbGUoaFRocmVhZFJpZ2h0KTsKCX0KCWZyZWUoTCk7CglmcmVlKFIpOwoJcmV0dXJuIDA7Cn0KCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pewoJaW50IGk7CglEV09SRCB0aWNrcyA9IDA7Cgljb25zdCBpbnQgc2l6ZSA9IDEwMDAwMDsKCWludCB2W3NpemVdOyAvKj0gezEsIDMsIDUsIDcsIDksIDIsIDQsIDYsIDgsIDEwfTsqLwoJZm9yIChpID0gMDsgaSA8IHNpemU7ICsraSkKCQl2W2ldID0gaSAlIDExOwoKCS8qcHJpbnRmKCJTb3VyY2UgYXJyYXk6XG4iKTsKCWZvcihpID0gMDsgaSA8IHNpemU7IGkrKykKCQlwcmludGYoIiVkICIsIHZbaV0pOwoJcHV0Y2hhcignXG4nKTsqLwoJc3RydWN0IFRocmVhZERhdGEgdGQgPSB7IChpbnQgKikmdiwgc2l6ZSB9OwoKCXRpY2tzID0gR2V0VGlja0NvdW50KCk7CgkvL21lcmdlc29ydCh2LCBzaXplKTsKCW1lcmdlc29ydF9wYXJhbGxlbCgodm9pZCAqKSZ0ZCk7CglwcmludGYoIlRpbWUgZWxhcHNlZDogJWQgbWlsbGlzXG4iLCBHZXRUaWNrQ291bnQoKSAtIHRpY2tzKTsKCgkvKnByaW50ZigiU29ydGVkIGFycmF5OlxuIik7Cglmb3IoaSA9IDA7IGkgPCBzaXplOyBpKyspCgkJcHJpbnRmKCIlZCAiLCB2W2ldKTsqLwoKCXByaW50ZigiXG5GaW5pc2hlZFxuIik7CgoJc2NhbmYoIiVkIiwgJmkpOwoJcmV0dXJuIDA7Cn0=