Пример программы:
// Функция объединяет два массива отсортированных по убыванию в один массив
// a, b - объединяемые массивы, c - результат, n - количество элементов в массивах а и b
void concatmas(int *a, int*b, int*c, int n)
{
int *a1=a, *b1=b, *c1=c;
int *i1=a+n, *j1=b+n;
while(a1<i1 && b1<j1)
if(*a1>*b1)
*c1++=*a1++;
else
*c1++=*b1++;
while(a1<i1)
*c1++=*a1++;
while(b1<j1)
*c1++=*b1++;
}
void quicksort(int *a, int *b, int n)
/* Выполняет быструю сортировку (слиянием)
a - сортируемый массив, b – промежуточный */
{
int t, p=1, q=n, p2=2;
int *a1=a, *b1=b, *tmp;
int *a21, *a22, *b2;
while(p<n)
{
#ifdef debug
printf("\np=%i, q=%i\n", p, q);
for(t=0; t<n; t++) printf("%i ", a[t]);
printf("\n");
#endif
a21=a1;
a22=a1+p;
b2=b1;
p2=2*p;
for(t=0; t<q/2; t++)
{
concatmas(a21, a22, b2, p);
a21+=p2;
a22+=p2;
b2 +=p2;
}
tmp=a1; a1=b1; b1=tmp;
p*=2; q/=2;
}
if (a1==b)
for(t=0; t<n; t++)
*b1++=*a1++;
}
main()
{
int n = 8, i, ntest=4, it, f;
int c[4][8] = { {1, 2, 4, 4, 5, 6, 7, 8},
{8, 7, 6, 5, 4, 3, 2, 1},
{1, 2, 8, 7, 3, 4, 6, 5},
{1, 8, 2, 7, 3, 6, 5, 4} };
int d[4][8] = { {8, 7, 6, 5, 4, 4, 2, 1},
{8, 7, 6, 5, 4, 3, 2, 1},
{8, 7, 6, 5, 4, 3, 2, 1},
{8, 7, 6, 5, 4, 3, 2, 1} };
int a[8];
for(it=0; it<ntest; it++)
{
printf("\n\tTest %i\n", it);
printf("\nc=\n");
for(i=0; i<n; i++) printf("%i ", c[it][i]);
quicksort(c[it], a, n);
printf("\nc=\n");
for(i=0; i<n; i++) printf("%i ", c[it][i]);
f=0;
for(i=0; i<n; i++) if(c[it][i]!=d[it][i]) f=1;
if(f==0) printf("\ntest passed\n");
else printf("\ntest failed!\n");
}
}