From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM autolearn=unavailable autolearn_force=no version=3.4.4 X-Received: by 10.140.153.194 with SMTP id 185mr36900203qhz.1.1455099402265; Wed, 10 Feb 2016 02:16:42 -0800 (PST) X-Received: by 10.182.153.2 with SMTP id vc2mr589059obb.11.1455099402204; Wed, 10 Feb 2016 02:16:42 -0800 (PST) Path: eternal-september.org!reader01.eternal-september.org!reader02.eternal-september.org!news.eternal-september.org!mx02.eternal-september.org!feeder.eternal-september.org!news.glorb.com!y89no871727qge.0!news-out.google.com!l1ni8689igd.0!nntp.google.com!hb3no2944307igb.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail Newsgroups: comp.lang.ada Date: Wed, 10 Feb 2016 02:16:41 -0800 (PST) In-Reply-To: <7a707f07-5a82-430b-becb-5daa4f47844d@googlegroups.com> Complaints-To: groups-abuse@google.com Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=57.79.21.1; posting-account=gRqrnQkAAAAC_02ynnhqGk1VRQlve6ZG NNTP-Posting-Host: 57.79.21.1 References: <2e3f8f3d-9247-4294-9ee7-961547674bc3@googlegroups.com> <7a707f07-5a82-430b-becb-5daa4f47844d@googlegroups.com> User-Agent: G2/1.0 MIME-Version: 1.0 Message-ID: <678d43f6-59fc-4768-b86c-9f5f43111b7b@googlegroups.com> Subject: Re: Quick Sort in Rosetta Code From: gautier_niouzes@hotmail.com Injection-Date: Wed, 10 Feb 2016 10:16:42 +0000 Content-Type: text/plain; charset=ISO-8859-1 Xref: news.eternal-september.org comp.lang.ada:29476 Date: 2016-02-10T02:16:41-08:00 List-Id: I did not dig too far into the fixing (the tricky thing is to avoid going out of range with indices) but here is, as an inspiration, a simplified case where the index type is integer, and this one is working (I've taken the C version to start with): with Ada.Numerics.Float_Random; use Ada.Numerics.Float_Random; --with Ada.Text_IO; use Ada.Text_IO; procedure Qsort is type Item_array is array(Integer Range <>) of Float; procedure Quick_sort (a: in out Item_array) is n: Integer:= a'Length; i, j: Integer; p, t: Float; begin if n < 2 then return; end if; p := a(n / 2 + a'First); i:= 0; j:= n - 1; loop while a(i + a'First) < p loop i:= i + 1; end loop; while p < a(j + a'First) loop j:= j - 1; end loop; exit when i >= j; t := a(i + a'First); a(i + a'First) := a(j + a'First); a(j + a'First) := t; i:= i + 1; j:= j - 1; end loop; Quick_sort(a(a'First .. a'First + i - 1)); Quick_sort(a(a'First + i .. a'Last)); end; gen: Generator; begin Reset(gen); for n in 1..100 loop for round in 1..500 loop declare start: Integer:= Integer(10.0 * (Random(gen)-0.5)); a: Item_array(start .. start + n - 1); begin for i in a'Range loop a(i):= Random(gen); end loop; Quick_sort(a); for i in a'Range loop -- Put_Line(Float'Image(a(i))); if i > a'First and then a(i-1) > a(i) then raise Program_Error; -- Buggy sorting end if; end loop; end; end loop; end loop; end; _________________________ Gautier's Ada programming http://sf.net/users/gdemont/