#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char str[] = "%u %u %u %u %u %u %u %u %u %u \n";
struct dividearrays
{
unsigned int * begin;
unsigned int * middle;
unsigned int * end;
};
// Функция принимает в качестве аргументов:
//// Указатель на начало массива, указатель на точку разделения,
//// указатель на конец массива
// Функция сортирует массив, если части массива, разделенные точкой
// разделения, сами отсортированы
void mergesort
(
unsigned int * array,
unsigned int * split,
unsigned int * end
)
{
unsigned int *result
= malloc((end
-array
)*sizeof(unsigned int)); unsigned int *result_ptr = result;
unsigned int *arr1, *arr2;
arr1 = array;
arr2 = split;
//printf(str, array[0], array[1], array[2], array[3], array[4],
// array[5], array[6], array[7], array[8], array[9]);
while ( (arr1 != split) && (arr2 != end) )
{
if ( *arr1 > *arr2 )
{
*result_ptr = *arr2;
arr2++;
} else
{
*result_ptr = *arr1;
arr1++;
}
result_ptr++;
}
if (arr1 == split)
{ // назначение - result, источник - arr2, размер копирования - ...
memcpy(result_ptr
, arr2
, (end
-arr2
) * sizeof(unsigned int) ); } else
{
memcpy(result_ptr
, arr1
, (split
-arr1
)*sizeof(unsigned int) ); }
memcpy (array
, result
, (end
-array
)*sizeof(unsigned int) ); }
// Функция принимает в качестве аргументов начало и конецмассива
// возвращает указатель на середину массива
unsigned int * findmiddle
(
unsigned int * array,
unsigned int * end
)
{
unsigned int * middle = array + ( (end - array) / 2 );
if ( middle == array )
{
return NULL;
}
return middle;
}
int main(void)
{
/////////////
/////////////
unsigned int arr[] = { 3, 243, 1, 26, 1111, 16, 78, 17, 1, 66, 13333, 34646, 24, 234, 1832,
13355, 234, 2761, 1, 666, 1337, 1488, 66666, 555, 1365, 136, 192, 256, 6566,
13513, 1356,666666, 999 };
unsigned int *middle;
size_t end = sizeof(arr)/sizeof(arr[0]);
// массив, в котором будут
// Начало, конец, середина.
struct dividearrays arr_div[33];
struct dividearrays *arr_div_p1, *arr_div_p2;
size_t i;
middle = findmiddle(arr, &arr[end]);
arr_div[0].begin = arr;
arr_div[0].middle = findmiddle(arr, &arr[end]);
arr_div[0].end = &arr[end];
arr_div_p1 = &arr_div[0];
arr_div_p2 = &arr_div[1];
///////////////////////
while ( arr_div_p1 != arr_div_p2 )
{
// Если в результате деления первой половины массива на две
// мы не пытались делить массив размером 1
if ( findmiddle((*arr_div_p1).begin, (*arr_div_p1).middle) != NULL )
{
// То тогда начало массива совпадает с началом того, который мы делим
arr_div_p2->begin = arr_div_p1->begin;
// Конец это серединка того массива, который мы делим
arr_div_p2->end = findmiddle(arr_div_p1->begin, arr_div_p1->end);
// А его серединка это серединка между началом массива (этого) и концом массива (этого)
arr_div_p2->middle = findmiddle(arr_div_p2->begin, arr_div_p2->end);
// Мы эту инфу записали в массив структур, и нам надо тогда записывать следующий в следующее
// Иначе бы мы повторно перезаписывали в то же место
arr_div_p2++;
}
// Если в результате деления второй половины массива на две
// мы не пытались делить массив размером 1
if ( findmiddle((*arr_div_p1).middle, (*arr_div_p1).end ) != NULL )
{
// Начало это серединка того массива, который мы делим
arr_div_p2->begin = findmiddle(arr_div_p1->begin, arr_div_p1->end);
// То тогда конец массива совпадает с концом того, который мы делим
arr_div_p2->end = arr_div_p1->end;
// А его серединка это серединка между началом массива (этого) и концом массива (этого)
arr_div_p2->middle = findmiddle(arr_div_p2->begin, arr_div_p2->end);
// Мы эту инфу записали в массив структур, и нам надо тогда записывать следующий в следующее
// Иначе бы мы повторно перезаписывали в то же место
arr_div_p2++;
}
// Переходим к следующей штуке, в которой есть начало середина конец
// Если ..., выйдем из этого цикла
arr_div_p1++;
}
///////////////////////
while ( arr_div_p2 != &arr_div[0])
{
arr_div_p2--; // <--- Теперь указатель стоит на одну ступеньку раньше, и он указывает на штуковину
mergesort(
arr_div_p2->begin,
arr_div_p2->middle,
arr_div_p2->end
);
}
for (i = 0; i < 33; i++)
{
}
///////////////////////
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPiAKCmNoYXIgc3RyW10gPSAiJXUgJXUgJXUgJXUgJXUgJXUgJXUgJXUgJXUgJXUgXG4iOwoKc3RydWN0IGRpdmlkZWFycmF5cwp7CiAgICB1bnNpZ25lZCBpbnQgKiBiZWdpbjsKICAgIHVuc2lnbmVkIGludCAqIG1pZGRsZTsKICAgIHVuc2lnbmVkIGludCAqIGVuZDsKfTsKCi8vINCk0YPQvdC60YbQuNGPINC/0YDQuNC90LjQvNCw0LXRgiDQsiDQutCw0YfQtdGB0YLQstC1INCw0YDQs9GD0LzQtdC90YLQvtCyOgovLy8vINCj0LrQsNC30LDRgtC10LvRjCDQvdCwINC90LDRh9Cw0LvQviDQvNCw0YHRgdC40LLQsCwg0YPQutCw0LfQsNGC0LXQu9GMINC90LAg0YLQvtGH0LrRgyDRgNCw0LfQtNC10LvQtdC90LjRjywKLy8vLyDRg9C60LDQt9Cw0YLQtdC70Ywg0L3QsCDQutC+0L3QtdGGINC80LDRgdGB0LjQstCwCi8vINCk0YPQvdC60YbQuNGPINGB0L7RgNGC0LjRgNGD0LXRgiDQvNCw0YHRgdC40LIsINC10YHQu9C4INGH0LDRgdGC0Lgg0LzQsNGB0YHQuNCy0LAsINGA0LDQt9C00LXQu9C10L3QvdGL0LUg0YLQvtGH0LrQvtC5Ci8vINGA0LDQt9C00LXQu9C10L3QuNGPLCDRgdCw0LzQuCDQvtGC0YHQvtGA0YLQuNGA0L7QstCw0L3RiwoKdm9pZCBtZXJnZXNvcnQKICAgICAgICAgICgKICAgICAgICAgICAgdW5zaWduZWQgaW50ICogYXJyYXksCiAgICAgICAgICAgIHVuc2lnbmVkIGludCAqIHNwbGl0LAogICAgICAgICAgICB1bnNpZ25lZCBpbnQgKiBlbmQKICAgICAgICAgICkKCnsKICAgIHVuc2lnbmVkIGludCAqcmVzdWx0ID0gbWFsbG9jKChlbmQtYXJyYXkpKnNpemVvZih1bnNpZ25lZCBpbnQpKTsKICAgIHVuc2lnbmVkIGludCAqcmVzdWx0X3B0ciA9IHJlc3VsdDsKICAgIHVuc2lnbmVkIGludCAqYXJyMSwgKmFycjI7CiAgICBhcnIxID0gYXJyYXk7CiAgICBhcnIyID0gc3BsaXQ7CiAgICAvL3ByaW50ZihzdHIsIGFycmF5WzBdLCBhcnJheVsxXSwgYXJyYXlbMl0sIGFycmF5WzNdLCBhcnJheVs0XSwKICAgIC8vICAgICAgICAgICAgYXJyYXlbNV0sIGFycmF5WzZdLCBhcnJheVs3XSwgYXJyYXlbOF0sIGFycmF5WzldKTsgCgogICAgd2hpbGUgKCAoYXJyMSAhPSBzcGxpdCkgJiYgKGFycjIgIT0gZW5kKSApCiAgICB7CiAgICAgICAgaWYgKCAqYXJyMSA+ICphcnIyICkKICAgICAgICB7CiAgICAgICAgICAgICpyZXN1bHRfcHRyID0gKmFycjI7CiAgICAgICAgICAgIGFycjIrKzsKICAgICAgICB9IGVsc2UKICAgICAgICB7CiAgICAgICAgICAgICpyZXN1bHRfcHRyID0gKmFycjE7CiAgICAgICAgICAgIGFycjErKzsKICAgICAgICB9CiAgICByZXN1bHRfcHRyKys7CiAgICB9CiAgICBpZiAoYXJyMSAgPT0gc3BsaXQpCiAgICB7IC8vICAg0L3QsNC30L3QsNGH0LXQvdC40LUgLSByZXN1bHQsINC40YHRgtC+0YfQvdC40LogLSBhcnIyLCDRgNCw0LfQvNC10YAg0LrQvtC/0LjRgNC+0LLQsNC90LjRjyAtIC4uLgogICAgICAgIG1lbWNweShyZXN1bHRfcHRyLCBhcnIyLCAoZW5kLWFycjIpICogc2l6ZW9mKHVuc2lnbmVkIGludCkgKTsKICAgIH0gZWxzZQogICAgewogICAgICAgIG1lbWNweShyZXN1bHRfcHRyLCBhcnIxLCAoc3BsaXQtYXJyMSkqc2l6ZW9mKHVuc2lnbmVkIGludCkgKTsKICAgIH0gICAgCiAgICAKICAgIG1lbWNweSAoYXJyYXksIHJlc3VsdCwgKGVuZC1hcnJheSkqc2l6ZW9mKHVuc2lnbmVkIGludCkgKTsKICAgIGZyZWUgKHJlc3VsdCk7Cn0KCi8vINCk0YPQvdC60YbQuNGPINC/0YDQuNC90LjQvNCw0LXRgiDQsiDQutCw0YfQtdGB0YLQstC1INCw0YDQs9GD0LzQtdC90YLQvtCyINC90LDRh9Cw0LvQviDQuCDQutC+0L3QtdGG0LzQsNGB0YHQuNCy0LAKLy8g0LLQvtC30LLRgNCw0YnQsNC10YIg0YPQutCw0LfQsNGC0LXQu9GMINC90LAg0YHQtdGA0LXQtNC40L3RgyDQvNCw0YHRgdC40LLQsAoKdW5zaWduZWQgaW50ICogZmluZG1pZGRsZQogICAgICAgICAgKAogICAgICAgICAgICB1bnNpZ25lZCBpbnQgKiBhcnJheSwKICAgICAgICAgICAgdW5zaWduZWQgaW50ICogZW5kCiAgICAgICAgICApCnsKICAgIHVuc2lnbmVkIGludCAqIG1pZGRsZSA9IGFycmF5ICsgKCAoZW5kIC0gYXJyYXkpIC8gMiApOwogICAgCiAgICBpZiAoIG1pZGRsZSA9PSBhcnJheSApCiAgICB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICByZXR1cm4gbWlkZGxlOwogICAgCn0KCgoKCmludCBtYWluKHZvaWQpCnsKLy8vLy8vLy8vLy8vLwoKCi8vLy8vLy8vLy8vLy8KICAgIAoKdW5zaWduZWQgaW50IGFycltdID0geyAzLCAyNDMsIDEsIDI2LCAxMTExLCAxNiwgNzgsIDE3LCAxLCA2NiwgMTMzMzMsIDM0NjQ2LCAyNCwgMjM0LCAxODMyLAogICAgICAgICAgICAgICAgICAgICAgIDEzMzU1LCAyMzQsIDI3NjEsIDEsIDY2NiwgMTMzNywgMTQ4OCwgNjY2NjYsIDU1NSwgMTM2NSwgMTM2LCAxOTIsIDI1NiwgNjU2NiwKICAgICAgICAgICAgICAgICAgICAgICAxMzUxMywgMTM1Niw2NjY2NjYsIDk5OSAgfTsKCgp1bnNpZ25lZCBpbnQgKm1pZGRsZTsKc2l6ZV90IGVuZCA9IHNpemVvZihhcnIpL3NpemVvZihhcnJbMF0pOwoKLy8g0LzQsNGB0YHQuNCyLCDQsiDQutC+0YLQvtGA0L7QvCDQsdGD0LTRg9GCCi8vINCd0LDRh9Cw0LvQviwg0LrQvtC90LXRhiwg0YHQtdGA0LXQtNC40L3QsC4KCnN0cnVjdCBkaXZpZGVhcnJheXMgYXJyX2RpdlszM107CnN0cnVjdCBkaXZpZGVhcnJheXMgKmFycl9kaXZfcDEsICphcnJfZGl2X3AyOwogCiAKCnNpemVfdCBpOwoKCm1pZGRsZSA9IGZpbmRtaWRkbGUoYXJyLCAmYXJyW2VuZF0pOwoKYXJyX2RpdlswXS5iZWdpbiAgPSBhcnI7CmFycl9kaXZbMF0ubWlkZGxlID0gZmluZG1pZGRsZShhcnIsICZhcnJbZW5kXSk7CmFycl9kaXZbMF0uZW5kICAgID0gJmFycltlbmRdOwoKYXJyX2Rpdl9wMSA9ICZhcnJfZGl2WzBdOwphcnJfZGl2X3AyID0gJmFycl9kaXZbMV07CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgd2hpbGUgKCBhcnJfZGl2X3AxICE9IGFycl9kaXZfcDIgKQogICAgewogICAgICAgIAogICAgICAgIC8vINCV0YHQu9C4INCyINGA0LXQt9GD0LvRjNGC0LDRgtC1INC00LXQu9C10L3QuNGPINC/0LXRgNCy0L7QuSDQv9C+0LvQvtCy0LjQvdGLINC80LDRgdGB0LjQstCwINC90LAg0LTQstC1CiAgICAgICAgLy8g0LzRiyDQvdC1INC/0YvRgtCw0LvQuNGB0Ywg0LTQtdC70LjRgtGMINC80LDRgdGB0LjQsiDRgNCw0LfQvNC10YDQvtC8IDEKICAgICAgICBpZiAoIGZpbmRtaWRkbGUoKCphcnJfZGl2X3AxKS5iZWdpbiwgICgqYXJyX2Rpdl9wMSkubWlkZGxlKSAhPSBOVUxMICkKICAgICAgICB7CiAgICAgICAgICAgIC8vINCi0L4g0YLQvtCz0LTQsCDQvdCw0YfQsNC70L4g0LzQsNGB0YHQuNCy0LAg0YHQvtCy0L/QsNC00LDQtdGCINGBINC90LDRh9Cw0LvQvtC8INGC0L7Qs9C+LCDQutC+0YLQvtGA0YvQuSDQvNGLINC00LXQu9C40LwKICAgICAgICAgICAgYXJyX2Rpdl9wMi0+YmVnaW4gID0gYXJyX2Rpdl9wMS0+YmVnaW47CgogICAgICAgICAgICAvLyDQmtC+0L3QtdGGINGN0YLQviDRgdC10YDQtdC00LjQvdC60LAg0YLQvtCz0L4g0LzQsNGB0YHQuNCy0LAsINC60L7RgtC+0YDRi9C5INC80Ysg0LTQtdC70LjQvAogICAgICAgICAgICBhcnJfZGl2X3AyLT5lbmQgICAgPSBmaW5kbWlkZGxlKGFycl9kaXZfcDEtPmJlZ2luLCAgYXJyX2Rpdl9wMS0+ZW5kKTsKCiAgICAgICAgICAgIC8vINCQINC10LPQviDRgdC10YDQtdC00LjQvdC60LAg0Y3RgtC+INGB0LXRgNC10LTQuNC90LrQsCDQvNC10LbQtNGDINC90LDRh9Cw0LvQvtC8INC80LDRgdGB0LjQstCwICjRjdGC0L7Qs9C+KSDQuCDQutC+0L3RhtC+0Lwg0LzQsNGB0YHQuNCy0LAgKNGN0YLQvtCz0L4pCiAgICAgICAgICAgIGFycl9kaXZfcDItPm1pZGRsZSA9IGZpbmRtaWRkbGUoYXJyX2Rpdl9wMi0+YmVnaW4sIGFycl9kaXZfcDItPmVuZCk7CgogICAgICAgICAgICAvLyDQnNGLINGN0YLRgyDQuNC90YTRgyDQt9Cw0L/QuNGB0LDQu9C4INCyINC80LDRgdGB0LjQsiDRgdGC0YDRg9C60YLRg9GALCDQuCDQvdCw0Lwg0L3QsNC00L4g0YLQvtCz0LTQsCDQt9Cw0L/QuNGB0YvQstCw0YLRjCDRgdC70LXQtNGD0Y7RidC40Lkg0LIg0YHQu9C10LTRg9GO0YnQtdC1CiAgICAgICAgICAgIC8vINCY0L3QsNGH0LUg0LHRiyDQvNGLINC/0L7QstGC0L7RgNC90L4g0L/QtdGA0LXQt9Cw0L/QuNGB0YvQstCw0LvQuCDQsiDRgtC+INC20LUg0LzQtdGB0YLQvgogICAgICAgICAgICBhcnJfZGl2X3AyKys7CiAgICAgICAgfQoKCiAgICAgICAgLy8g0JXRgdC70Lgg0LIg0YDQtdC30YPQu9GM0YLQsNGC0LUg0LTQtdC70LXQvdC40Y8g0LLRgtC+0YDQvtC5INC/0L7Qu9C+0LLQuNC90Ysg0LzQsNGB0YHQuNCy0LAg0L3QsCDQtNCy0LUKICAgICAgICAvLyDQvNGLINC90LUg0L/Ri9GC0LDQu9C40YHRjCDQtNC10LvQuNGC0Ywg0LzQsNGB0YHQuNCyINGA0LDQt9C80LXRgNC+0LwgMSAgICAgICAgCiAgICAgICAgaWYgKCBmaW5kbWlkZGxlKCgqYXJyX2Rpdl9wMSkubWlkZGxlLCAoKmFycl9kaXZfcDEpLmVuZCAgICkgIT0gTlVMTCApCiAgICAgICAgewogICAgICAgICAgICAvLyDQndCw0YfQsNC70L4g0Y3RgtC+INGB0LXRgNC10LTQuNC90LrQsCDRgtC+0LPQviDQvNCw0YHRgdC40LLQsCwg0LrQvtGC0L7RgNGL0Lkg0LzRiyDQtNC10LvQuNC8CiAgICAgICAgICAgIGFycl9kaXZfcDItPmJlZ2luICA9IGZpbmRtaWRkbGUoYXJyX2Rpdl9wMS0+YmVnaW4sIGFycl9kaXZfcDEtPmVuZCk7CgogICAgICAgICAgICAvLyDQotC+INGC0L7Qs9C00LAg0LrQvtC90LXRhiDQvNCw0YHRgdC40LLQsCDRgdC+0LLQv9Cw0LTQsNC10YIg0YEg0LrQvtC90YbQvtC8INGC0L7Qs9C+LCDQutC+0YLQvtGA0YvQuSDQvNGLINC00LXQu9C40LwKICAgICAgICAgICAgYXJyX2Rpdl9wMi0+ZW5kICAgID0gYXJyX2Rpdl9wMS0+ZW5kOwoKICAgICAgICAgICAgLy8g0JAg0LXQs9C+INGB0LXRgNC10LTQuNC90LrQsCDRjdGC0L4g0YHQtdGA0LXQtNC40L3QutCwINC80LXQttC00YMg0L3QsNGH0LDQu9C+0Lwg0LzQsNGB0YHQuNCy0LAgKNGN0YLQvtCz0L4pINC4INC60L7QvdGG0L7QvCDQvNCw0YHRgdC40LLQsCAo0Y3RgtC+0LPQvikKICAgICAgICAgICAgYXJyX2Rpdl9wMi0+bWlkZGxlID0gZmluZG1pZGRsZShhcnJfZGl2X3AyLT5iZWdpbiwgYXJyX2Rpdl9wMi0+ZW5kKTsKCiAgICAgICAgICAgIC8vINCc0Ysg0Y3RgtGDINC40L3RhNGDINC30LDQv9C40YHQsNC70Lgg0LIg0LzQsNGB0YHQuNCyINGB0YLRgNGD0LrRgtGD0YAsINC4INC90LDQvCDQvdCw0LTQviDRgtC+0LPQtNCwINC30LDQv9C40YHRi9Cy0LDRgtGMINGB0LvQtdC00YPRjtGJ0LjQuSDQsiDRgdC70LXQtNGD0Y7RidC10LUKICAgICAgICAgICAgLy8g0JjQvdCw0YfQtSDQsdGLINC80Ysg0L/QvtCy0YLQvtGA0L3QviDQv9C10YDQtdC30LDQv9C40YHRi9Cy0LDQu9C4INCyINGC0L4g0LbQtSDQvNC10YHRgtC+CiAgICAgICAgICAgIGFycl9kaXZfcDIrKzsKICAgICAgICB9CgogICAgICAgIC8vINCf0LXRgNC10YXQvtC00LjQvCDQuiDRgdC70LXQtNGD0Y7RidC10Lkg0YjRgtGD0LrQtSwg0LIg0LrQvtGC0L7RgNC+0Lkg0LXRgdGC0Ywg0L3QsNGH0LDQu9C+INGB0LXRgNC10LTQuNC90LAg0LrQvtC90LXRhgogICAgICAgIC8vINCV0YHQu9C4IC4uLiwg0LLRi9C50LTQtdC8INC40Lcg0Y3RgtC+0LPQviDRhtC40LrQu9CwCiAgICAgICAgYXJyX2Rpdl9wMSsrOwogICAgfQovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKCndoaWxlICggYXJyX2Rpdl9wMiAhPSAmYXJyX2RpdlswXSkKewogICAgYXJyX2Rpdl9wMi0tOyAvLyA8LS0tINCi0LXQv9C10YDRjCDRg9C60LDQt9Cw0YLQtdC70Ywg0YHRgtC+0LjRgiDQvdCwINC+0LTQvdGDINGB0YLRg9C/0LXQvdGM0LrRgyDRgNCw0L3RjNGI0LUsINC4INC+0L0g0YPQutCw0LfRi9Cy0LDQtdGCINC90LAg0YjRgtGD0LrQvtCy0LjQvdGDCiAgICBtZXJnZXNvcnQoCiAgICAgICAgICAgIGFycl9kaXZfcDItPmJlZ2luLAogICAgICAgICAgICBhcnJfZGl2X3AyLT5taWRkbGUsCiAgICAgICAgICAgIGFycl9kaXZfcDItPmVuZAogICAgICAgICAgKTsKfQoKCmZvciAoaSA9IDA7IGkgPCAzMzsgaSsrKQp7CiAgcHJpbnRmKCIldSAiLCBhcnJbaV0pOwp9CiAgcHJpbnRmKCJcbiIpOwovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKcmV0dXJuIDA7Cn0K