Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- CREATE OR REPLACE FUNCTION mergesort(A double precision[], p integer, r integer)
- RETURNS double precision[] AS $$
- SELECT
- CASE WHEN p < r THEN mergesort(A,p,floor((p+r)/2)::integer)
- WHEN p < r THEN mergesort(A,floor((p+r)/2)::integer+1,r)
- WHEN p < r THEN merge(A,p,floor((p+r)/2)::integer,r)
- ELSE A
- END;
- $$ LANGUAGE SQL;
- CREATE FUNCTION merge(A double precision[], p integer, q integer, r integer)
- RETURNS double precision[] AS $$
- DECLARE
- n1 integer := q-p+1;
- n2 integer := r-q;
- L double precision[];
- Ri double precision[];
- g integer;
- h integer;
- BEGIN
- L = ARRAY[n1+1];
- Ri = ARRAY[n2+1];
- FOR i in 1..(n1+1) LOOP
- L[i] = A[p+i-1];
- END LOOP;
- FOR j in 1..n2+1 LOOP
- Ri[j] = A[q+j];
- END LOOP;
- L[n1+1] = 'Infinity';
- Ri[n2+1] = 'Infinity';
- g = 1;
- h = 1;
- FOR k in p..r LOOP
- IF L[g] <= Ri[h] THEN
- A[k] = L[g];
- g = g + 1;
- ELSE
- A[k] = Ri[h];
- h = h + 1;
- END IF;
- END LOOP;
- RETURN A;
- END;
- $$ LANGUAGE plpgsql;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement