Bubble sorting in progress
JavaScript (ES6), 102 82 80 86 80 bytes
Bug fix and 1 byte saved thanks to @edc65
(a,m)=>eval("for(i=0;m;a[j=i-1]>(b=a[i])?a[a[i]=a[j],j]=b:0)1/a[++i]?m--:i=0;a")
Recursion may not be is definitely not is probably the best approach, but I'm sticking with a loop for now.
Try it out:
f=(a,m)=>eval("for(i=0;m;a[j=i-1]>(b=a[i])?a[a[i]=a[j],j]=b:0)1/a[++i]?m--:i=0;a")
Enter your numbers:<br>
<input id=A rows=10 value="5 1 4 2 8"><br>
Enter the number of steps:<br>
<input type="number" min=0 id=B rows=10 value="1"><br>
<button onclick="C.innerHTML=f((A.value.match(/-?\d+/g)||[]).map(Number),B.value)">Run</button><br>
<pre id=C></pre>
Haskell, 83 82 81 bytes
y%x@(a:b:c)=(y++x):(y++[min a b])%(max a b:c)
y%x=[]%(y++x)
[x]!_=[x]
x!n=[]%x!!n
Usage example: [5,1,4,2,8] ! 5
-> [1,4,2,5,8]
.
In function %
y
keeps track of the elements visited so far during the current pass, x
are ones yet to examine. a
and b
are the next two, i.e. the candidates to swap. If we reach the end of the list, we start from the beginning: y%x = []%(y++x)
. All steps are stored in a list where the main function picks the n
th element.
Edit: previous versions didn't work for single element lists, luckily the new version is even shorter.
Python 3, 77 74 bytes
-3 bytes thanks to @Maltysen (init j
in declaration)
lambda l,n,j=0:exec('j*=j<len(l)-1;l[j:j+2]=sorted(l[j:j+2]);j+=1;'*n)or l
Test cases at ideone
Uses sorted
to do each compare and swap operation, but it is performing a bubble sort.
Sets j=0
(the left index), then performs n
compare and swaps of adjacent list items, resetting j
to 0
whenever this window goes out of bounds.
The j*=j<len(l)-1
will multiply j
by False
(i.e. 0
) at that point, whereas every other time it will multiply j
by True
(i.e. 1
).
(It will still work for an empty list too.)