Текст подпрограммы и версий
avz4r_c.zip  avz4d_c.zip  avz6r_c.zip  avz6d_c.zip 
Тексты тестовых примеров
tavz4r_c.zip  tavz4d_c.zip  tavz6r_c.zip  tavz6d_c.zip 

Подпрограмма:  avz4r_c (версия avz6r_c)

Назначение

Упорядочивание вектора по возрастанию абсолютных значений его компонент с запоминанием произведенных перестановок.

Математическое описание

avz4r_c производит упорядочивание  N последовательно расположенных компонент вектора  А по возрастанию абсолютных значений с запоминанием произведенных перестановок в векторе IР.

R.С.Singleton, Аlgorithm 347, an efficient algorithm for sorting with minimal storage, CACM, 12, 3, 1969.

Использование

    int avz4r_c (real *a, integer *n, integer *ip)

Параметры

a - вещественный одномерный массив размера по крайней мере  n, содержащий компоненты исходного вектора  A; по окончании работы подпрограммы содержит абсолютные значения компонент в возрастающем порядке;
n - заданное число упорядочиваемых компонент (тип: целый);
ip - целый вектор длины  n, содержащий информацию о произведенных перестановках при упорядочивании (см. замечания по использованию).

Версии

avz4d_c - упорядочивание вектора, заданного с удвоенной точностью, по возрастанию абсолютных значений его компонент с запоминанием произведенных перестановок.
avz6r_c - упорядочивание вектора по возрастанию значений его компонент с запоминанием призведенных перестановок.
avz6d_c - упорядочивание вектора, заданного с удвоенной точностью, по возрастанию значений его компонент с запоминанием призведенных перестановок.

Вызываемые подпрограммы: нет

Замечания по использованию

 

В подпрограммах avz4d_c и avz6d_c параметр  a должен иметь тип double.

Компонентам целого вектора IP перед началом работы подпрограмм должны быть присвоены следующие значения:

              IP(1) = 1 ,  IP(2) = 2 , ... ,  IP(N) = N . 

В ходе работы подпрограмм над компонентами вектора IP производятся те же перестановки, что и над компонентами вектора  A. В общем случае вектор IP может содержать на входе любую подстановку.

По окончании работы подпрограммы avz6r_c и avz6d_c массив  a содержит компоненты исходного вектора в возрастающем порядке.

Пример использования

1.
int main(void)
{
    /* Initialized data */
    static float a[10] = { 10.f,9.f,8.f,7.f,6.f,5.f,4.f,3.f,2.f,1.f };
    static int ipa[10] = { 1,2,3,4,5,6,7,8,9,10 };

    /* Local variables */
    extern int avz4r_c(float *, int *, int *);
    static int na, j;

    na = 10;
    avz4r_c(a, &na, ipa);

    for (j = 0; j <= 5; j += 5) {
         printf("\n  %13.5e %13.5e %13.5e %13.5e %13.5e \n",
                a[j], a[j+1], a[j+2], a[j+3], a[j+4]);
    }
    printf("\n  %5i %5i %5i %5i %5i %5i %5i %5i %5i %5i \n",
           ipa[0], ipa[1], ipa[2], ipa[3], ipa[4],
           ipa[5], ipa[6], ipa[7], ipa[8], ipa[9]);
    return 0;
} /* main */


Результаты:

       a     =  (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
       ipa  =  (10, 9, 8, 7, 6, 5, 4, 3, 2, 1)

2.
int main(void)
{
    /* Initialized data */
    static float b[10] = { -1.f,-2.f,-3.f,-4.f,-5.f,-6.f,-7.f,-8.f,-9.f,-10.f };
    static int ipb[5] = { 1,2,3,4,5 };

    /* Local variables */
    extern int avz6r_c(float *, int *, int *);
    static int nb, j;

    nb = 5;
    avz6r_c(b, &nb, ipb);

    for (j = 0; j <= 5; j += 5) {
         printf("\n  %13.5e %13.5e %13.5e %13.5e %13.5e \n",
                b[j], b[j+1], b[j+2], b[j+3], b[j+4]);
    }
    printf("\n  %5i %5i %5i %5i %5i %5i %5i %5i %5i %5i \n",
           ipb[0], ipb[1], ipb[2], ipb[3], ipb[4]);
    return 0;
} /* main */


Результаты:

       b     =  (- 5, - 4, - 3, - 2, - 1, - 6, - 7, - 8, - 9, - 10)
       ipb  =  (5, 4, 3, 2, 1)