🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.programming
Article #215862

Re: Sortowanie bąbelkowe

#215862
From: godek.maciek
Date: Thu, 22 Aug 2019 09:13
74 lines
4388 bytes
W dniu czwartek, 22 sierpnia 2019 10:57:40 UTC+2 użytkownik Maciej Sobczak napisał:
> Nudy jakieś, wszyscy na urlopach?
> W każdym razie, skoro ostatnio były tu fajne dyskusje o różnych językach programowania, to pozwolę sobie dla hecy pokazać sortowanie bąbelkowe w Wolframie.
> 
> Otóż jak wiadomo, pojedynczy krok sortowania polega na tym, że jeśli gdzieś jest para elementów w "niewłaściwej" kolejności, to trzeba je zamienić miejscami. A potem powtarzać to aż do skutku.
> 
> No to mamy, pojedynczy krok:
> 
> oneBubbleStep[lst_] := 
>  lst /. {pre___, a_, b_, post___} /; a > b -> {pre, b, a, post}
> 
> oneBubbleStep to funkcja, która ma jeden parametr, nazwany lst. Ta funkcja szuka wzorca:
> 
> {pre___, a_, b_, post___}
> 
> wzorzec ma być listą, składającą się z:
> 1. jakiegoś pre, zero lub więcej elementów
> 2. jakiegoś a
> 3. jakiegoś b
> 4. jakiegoś post, zero lub więcej elementów
> 
> i jeśli przypadkiem a > b, to znaleziony wzorzec ma być zamieniony na taki:
> 
> {pre, b, a, post}
> 
> czyli elementy a i b mają się zamienić miejscami. Jeśli wzorzec nie pasuje, to żadna zmiana nie jest wykonana. To zadziała zawsze, nawet na brzegach, np.:
> 
> oneBubbleStep[{10, 20, 40, 30, 50}]
> 
> {10, 20, 30, 40, 50}
> 
> I teraz biorę jakieś dane testowe:
> 
> testData = RandomSample[Range[10], 10]
> 
> {2, 10, 1, 3, 8, 9, 6, 4, 5, 7}
> 
> i aplikuję funkcję oneBubbleStep tak długo, aż wynik przestanie się zmieniać, pokazując po drodze wszystkie pośrednie wyniki (sformatowałem ręcznie):
> 
> FixedPointList[oneBubbleStep, testData]
> 
> {
>  {2, 10, 1, 3, 8, 9, 6, 4, 5, 7},
>  {2, 1, 10, 3, 8, 9, 6, 4, 5, 7},
>  {1, 2, 10, 3, 8, 9, 6, 4, 5, 7},
>  {1, 2, 3, 10, 8, 9, 6, 4, 5, 7},
>  {1, 2, 3, 8, 10, 9, 6, 4, 5, 7},
>  {1, 2, 3, 8, 9, 10, 6, 4, 5, 7},
>  {1, 2, 3, 8, 9, 6, 10, 4, 5, 7},
>  {1, 2, 3, 8, 6, 9, 10, 4, 5, 7},
>  {1, 2, 3, 6, 8, 9, 10, 4, 5, 7},
>  {1, 2, 3, 6, 8, 9, 4, 10, 5, 7},
>  {1, 2, 3, 6, 8, 4, 9, 10, 5, 7},
>  {1, 2, 3, 6, 4, 8, 9, 10, 5, 7},
>  {1, 2, 3, 4, 6, 8, 9, 10, 5, 7},
>  {1, 2, 3, 4, 6, 8, 9, 5, 10, 7},
>  {1, 2, 3, 4, 6, 8, 5, 9, 10, 7},
>  {1, 2, 3, 4, 6, 5, 8, 9, 10, 7},
>  {1, 2, 3, 4, 5, 6, 8, 9, 10, 7},
>  {1, 2, 3, 4, 5, 6, 8, 9, 7, 10},
>  {1, 2, 3, 4, 5, 6, 8, 7, 9, 10},
>  {1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
>  {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
> }
> 
> Ten "program" ma swoją interpunkcję, która na pewno się tu komuś nie spodoba, ale ma ciekawą zaletę: odzwierciedla opis słowny. Fajne?

Rzeczywiście ładne.
Spośród rozwiązań na Rosetta Code to w Wolframie jest niewątpliwie najładniejsze:

bubbleSort[{w___, x_, y_, z___}] /; x > y := bubbleSort[{w, y, x, z}]
bubbleSort[sortedList_] := sortedList

Szkoda tylko, że taka brzydka interpunkcja ;]
Technical Details
Message-ID: <bb74ad83-47d5-486e-87cc-6c8bc019f58b@googlegroups.com>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!news-2.dfn.de!news.dfn.de!news.uni-stuttgart.de!news.unit0.net!newsreader4.netcologne.de!news.netcologne.de!peer03.ams1!peer.ams1.xlned.com!news.xlned.com!peer03.am4!peer.am4.highwinds-media.com!peer03.iad!feed-me.highwinds-media.com!news.highwinds-media.com!f14no3925193qtq.0!news-out.google.com!d29ni2506qtg.1!nntp.google.com!f14no3925184qtq.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail
References: <5889b9db-7fee-49e4-acd6-1f037733f5f3@googlegroups.com>

Show Full Headers
Complete Article Headers
X-Received: by 2002:a0c:ef92:: with SMTP id w18mr20753091qvr.41.1566465234537;        Thu, 22 Aug 2019 02:13:54 -0700 (PDT)
X-Received: by 2002:ac8:468f:: with SMTP id g15mr35826701qto.353.1566465234378; Thu, 22 Aug 2019 02:13:54 -0700 (PDT)
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!news-2.dfn.de!news.dfn.de!news.uni-stuttgart.de!news.unit0.net!newsreader4.netcologne.de!news.netcologne.de!peer03.ams1!peer.ams1.xlned.com!news.xlned.com!peer03.am4!peer.am4.highwinds-media.com!peer03.iad!feed-me.highwinds-media.com!news.highwinds-media.com!f14no3925193qtq.0!news-out.google.com!d29ni2506qtg.1!nntp.google.com!f14no3925184qtq.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail
Newsgroups: pl.comp.programming
Date: Thu, 22 Aug 2019 02:13:54 -0700 (PDT)
In-Reply-To: <5889b9db-7fee-49e4-acd6-1f037733f5f3@googlegroups.com>
Complaints-To: groups-abuse@google.com
Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=213.192.68.153; posting-account=f7iIKQoAAAAkDKpUafc-4IXhmRAzdB5r
NNTP-Posting-Host: 213.192.68.153
References: <5889b9db-7fee-49e4-acd6-1f037733f5f3@googlegroups.com>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <bb74ad83-47d5-486e-87cc-6c8bc019f58b@googlegroups.com>
Subject: Re: Sortowanie bąbelkowe
From: godek.maciek@gmail.com
Injection-Date: Thu, 22 Aug 2019 09:13:54 +0000
X-Received-Bytes: 4585
X-Received-Body-CRC: 1934068815
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit