Я уже выяснил и хотел поделиться с вами решением.Теперь я выбрал функциональный алгоритм, который легче реализовать в 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;