33,007
社区成员
发帖
与我相关
我的任务
分享
#include<stdio.h>
#include<stdlib.h>
//三点中值
int get_mid(int _1st, int _2nd, int _3rd)
{
if ((_2nd <= _1st && _1st <= _3rd) || (_3rd <= _1st && _1st <= _2nd))
return _1st;
if ((_1st <= _2nd && _2nd <= _3rd) || (_3rd <= _2nd && _2nd <= _1st))
return _2nd;
return _3rd;
}
//插入排序
void my_sort(int *f, int *l)
{
int *i, *j;
for (i = f; i < l; ++i)
{
int tmp = *i;
for (j = i; j > f; --j)
{
if (tmp < *(j - 1))
*j = *(j - 1);
else
break;
}
*j = tmp;
}
}
//分割函数,保证小于mid的元素排在大于mid的元素的前面
int *my_partition(int *f, int *l, int mid)
{
int tmp;
while (f < l)
{
while (*f < mid)
++f;
while (*--l > mid)
;
if (!(f < l))
return f;
tmp = *f;
*f++ = *l;
*l = tmp;
}
return f;
}
//如果是C++的话,可以直接使用算法库中的nth_element函数,就不需要自定义这个函数了
void my_find_nth_element(int *f, int *nth, int *l)
{
while (f + 3 < l)
{
int *cut = my_partition(f, l, get_mid(*f, *(l - 1), *((l - f) / 2 + f)));
if (cut <= nth)
f = cut;
else
l = cut;
}
my_sort(f, l);
}
void func(int *f, int *l, int k)
{
int i, j;
int len;
if (NULL == f || NULL == l || l <= f || ((l - f) % k))
return;
//分割为k部分
for (i = 0, len = (l - f) / k; i < k - 1; ++i)
{
my_find_nth_element(f + i * len, f + (i + 1) * len, l);
}
//打印分割后每部分的值
for (i = 0; i < k; ++i)
{
for (j = 0; j < len; ++j)
{
printf("%d\t", f[i * len + j]);
}
printf("\n");
}
}
int main()
{
int a[] = {10, 13, 20, 12, 15, 9, 3, 19, 23, 2, 21, 5, 4, 14, 17, 16, 1, 7, 22, 8, 0, 6, 11, 18};
func(a, a + sizeof(a) / sizeof(a[0]), 4);
system("pause");
return 0;
}