Реализация учебника MergeSort в SQL (Postgres)

Проще говоря, да. Порядок элементов значим в XML и поэтому сохраняется при десериализации.

Кроме того, поскольку порядок элементов в списке или массиве значителен, он должен быть сохранен, чтобы сериализация XML была значимой .

0
задан Peter Richter 18 March 2019 в 15:10
поделиться

1 ответ

Я уже выяснил и хотел поделиться с вами решением. Сейчас я выбрал функциональный алгоритм, который легче реализовать на SQL, чем императивный.

Слияние:

CREATE OR REPLACE FUNCTION mergesort(A double precision[]) 
RETURNS double precision[] AS $
    SELECT 
        CASE WHEN 1 < array_length(A,1) 
              THEN merge(mergesort(A[1:floor((1+array_length(A,1))/2)::integer]),
                         mergesort(A[floor((1+array_length(A,1))/2)::integer+1:array_length(A,1)]),
                         1,
                         1,
                         ARRAY[]::double precision[])
             ELSE A
        END;
$ LANGUAGE SQL;

Слияние:

CREATE OR REPLACE FUNCTION merge(A1 double precision[],A2 double precision[], i integer, j integer,acc double precision[]) 
RETURNS double precision[] AS $
    SELECT 
        CASE WHEN (i > array_length(A1,1) and j > array_length(A2,1)) THEN acc
             WHEN i > array_length(A1,1) THEN merge(A1,A2,i,j+1,array_append(acc,A2[j]))
             WHEN j > array_length(A2,1) THEN merge(A1,A2,i+1,j,array_append(acc,A1[i]))
             WHEN A1[i] <  A2[j] THEN merge(A1,A2,i+1,j,array_append(acc, A1[i]))
             WHEN A1[i] >= A2[j] THEN merge(A1,A2,i,j+1,array_append(acc, A2[j]))                
        END;
$ LANGUAGE SQL;
0
ответ дан Peter Richter 18 March 2019 в 15:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: