<snapdata remixID="9472165"><project name="Bubble/Quick" app="Snap! 6, https://snap.berkeley.edu" version="1"><notes></notes><thumbnail>data:image/png;base64,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</thumbnail><stage name="Stage" width="480" height="360" costume="0" color="255,255,255,1" tempo="60" threadsafe="false" penlog="false" volume="100" pan="0" lines="round" ternary="false" hyperops="true" codify="false" inheritance="true" sublistIDs="false" scheduled="false" id="1"><pentrails>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAFoCAYAAACPNyggAAAOhUlEQVR4Xu3VwQkAAAjEMN1/abewn7jAQRC64wgQIECAAIF3gX1fNEiAAAECBAiMAHsCAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQIHLFxAWmhEwHPAAAAAElFTkSuQmCC</pentrails><costumes><list struct="atomic" id="2"></list></costumes><sounds><list struct="atomic" id="3"></list></sounds><variables></variables><blocks></blocks><scripts></scripts><sprites><sprite name="Sprite" idx="1" x="0" y="-1.4210854715202004e-13" heading="90" scale="1" volume="100" pan="0" rotation="1" draggable="true" costume="0" color="80,80,80,1" pen="tip" id="8"><costumes><list struct="atomic" id="9"></list></costumes><sounds><list struct="atomic" id="10"></list></sounds><blocks></blocks><variables></variables><scripts><script x="20" y="20"><block s="doSetVar"><l>thelist</l><block s="reportNumbers"><l>1</l><l>10</l></block><comment w="348" collapsed="false">Try executing these scripts and see what the list looks like on the stage </comment></block><custom-block s="swap item: %n and item: %n of list: %l"><l>3</l><l>7</l><block var="thelist"/></custom-block></script><script x="20" y="84.83333333333326"><block s="doSetVar"><l>thelist</l><block s="reportNumbers"><l>1</l><l>10</l></block></block><custom-block s="reverse list: %l"><block var="thelist"/></custom-block></script><script x="20" y="149.66666666666657"><block s="doSetVar"><l>thelist</l><block s="reportNumbers"><l>1</l><l>10</l></block></block><custom-block s="scramble list: %l"><block var="thelist"/></custom-block></script><script x="20" y="214.49999999999991"><block s="doSetVar"><l>thelist</l><block s="reportNumbers"><l>1</l><l>10</l><comment w="253" collapsed="false">Execute this script to see how many operations it takes to bubble-sort a scrambled list. </comment></block></block><custom-block s="scramble list: %l"><block var="thelist"/></custom-block><custom-block s="bubble sort list: %l with comparator: %predRing comps: %upvar swaps: %upvar"><block var="thelist"/><block s="reifyPredicate"><autolambda><block s="reportLessThan"><l></l><l></l></block></autolambda><list></list></block><l>ncomps</l><l>nswaps</l></custom-block><block s="doSetVar"><l>COMPS</l><block var="ncomps"/></block><block s="doSetVar"><l>SWAPS</l><block var="nswaps"/></block></script><script x="20" y="373.1666666666665"><block s="doSetVar"><l>thelist</l><block s="reportNumbers"><l>1</l><l>10</l></block><comment w="252.236328125" collapsed="false">Execute this script to see how many operations it takes to quick-sort a scrambled list.</comment></block><custom-block s="scramble list: %l"><block var="thelist"/></custom-block><custom-block s="quick sort list: %l with %predRing comps: %upvar swaps: %upvar"><block var="thelist"/><block s="reifyPredicate"><autolambda><block s="reportLessThan"><l></l><l></l></block></autolambda><list></list></block><l>ncomps</l><l>nswaps</l></custom-block><block s="doSetVar"><l>COMPS</l><block var="ncomps"/></block><block s="doSetVar"><l>SWAPS</l><block var="nswaps"/></block></script><comment x="20" y="552.6666666666666" w="349" collapsed="false">Test and analyze for each of the sort algorithms:&#xD;&#xD;* What is the relationship between COMPS and SWAPS?&#xD;* Use the &gt; predicate instead&#xD;* Change the size of the list&#xD;* Instead of scrambling, sort an already-sorted list, or a reverse-sorted list.</comment></scripts></sprite><watcher var="thelist" style="normal" x="9.999999999999545" y="10.000000000000014" color="243,118,29" extX="81" extY="205"/><watcher var="COMPS" style="normal" x="174.00000000000023" y="12.000001999999988" color="243,118,29"/><watcher var="SWAPS" style="normal" x="174.00000000000023" y="43.00000400000005" color="243,118,29"/></sprites></stage><hidden></hidden><headers></headers><code></code><blocks><block-definition s="swap item: %&apos;i&apos; and item: %&apos;j&apos; of list: %&apos;list&apos;" type="command" category="lists"><comment w="149" collapsed="false">Replaces the ith and jth items in the list with each other. No bounds checking</comment><header></header><code></code><translations></translations><inputs><input type="%n"></input><input type="%n"></input><input type="%l"></input></inputs><script><block s="doDeclareVariables"><list><l>hold item i for a sec</l></list></block><block s="doSetVar"><l>hold item i for a sec</l><block s="reportListItem"><block var="i"/><block var="list"/></block></block><block s="doReplaceInList"><block var="i"/><block var="list"/><block s="reportListItem"><block var="j"/><block var="list"/></block></block><block s="doReplaceInList"><block var="j"/><block var="list"/><block var="hold item i for a sec"/></block></script></block-definition><block-definition s="bubble sort list: %&apos;list&apos; with comparator: %&apos;compr&apos; comps: %&apos;ncomps&apos; swaps: %&apos;nswaps&apos;" type="command" category="lists"><comment w="207" collapsed="false">Use the bubble sort algorithm to sort a list of any kind of object, using a comparator (1-input reporter that reports whether the first input belongs before the second). &#xD;&#xD;For a &apos;normal&apos; increasing sort of numbers or strings, use the regular &lt; operator.&#xD;&#xD;Upvars ncomps and nswaps return a count of the number of calls to the comparator, and the number of times an out-of-order bubble is swapped. </comment><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%predRing"></input><input type="%upvar"></input><input type="%upvar"></input></inputs><script><block s="doWarp"><script><block s="doSetVar"><l>ncomps</l><l>0</l></block><block s="doSetVar"><l>nswaps</l><l>0</l></block><block s="doFor"><l>maxi</l><block s="reportDifference"><block s="reportListLength"><block var="list"/></block><l>1</l></block><l>1</l><script><block s="doFor"><l>i</l><l>1</l><block var="maxi"/><script><block s="doChangeVar"><l>ncomps</l><l>1</l></block><block s="doIf"><block s="evaluate"><block var="compr"/><list><block s="reportListItem"><block s="reportSum"><block var="i"/><l>1</l></block><block var="list"/></block><block s="reportListItem"><block var="i"/><block var="list"/></block></list></block><script><block s="doChangeVar"><l>nswaps</l><l>1</l></block><custom-block s="swap item: %n and item: %n of list: %l"><block var="i"/><block s="reportSum"><block var="i"/><l>1</l></block><block var="list"/></custom-block></script><comment w="186" collapsed="false">If this comparator returns true, then items i and i+1 are out of order</comment></block></script></block></script><comment w="102" collapsed="false">n-1 passes&#xD;pass 1: i=1...n-1&#xD;pass 2: i=1...n-2 ...</comment></block></script></block></script></block-definition><block-definition s="scramble list: %&apos;list&apos;" type="command" category="lists"><comment w="90" collapsed="false">Scramble a list into a random order</comment><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doFor"><l>i</l><l>1</l><block s="reportListLength"><block var="list"/></block><script><custom-block s="swap item: %n and item: %n of list: %l"><block var="i"/><block s="reportRandom"><l>1</l><block s="reportListLength"><block var="list"/></block></block><block var="list"/></custom-block></script></block></script></block-definition><block-definition s="reverse list: %&apos;list&apos;" type="command" category="lists"><comment w="150.767578125" collapsed="false">Put a list into reverse order</comment><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doFor"><l>i</l><l>1</l><block s="reportQuotient"><block s="reportListLength"><block var="list"/></block><l>2</l></block><script><custom-block s="swap item: %n and item: %n of list: %l"><block var="i"/><block s="reportSum"><block s="reportDifference"><block s="reportListLength"><block var="list"/></block><block var="i"/></block><l>1</l></block><block var="list"/></custom-block></script></block></script></block-definition><block-definition s="quick sort list: %&apos;list&apos; with %&apos;comparator:&apos; comps: %&apos;ncomps&apos; swaps: %&apos;nswaps&apos;" type="command" category="lists"><comment w="132" collapsed="false">Use the quicksort algorithm to sort a list of any kind of object, using a comparator (1-input reporter that reports whether the first input belongs before the second). &#xD;&#xD;For a &apos;normal&apos; increasing sort of numbers or strings, use the regular &lt; operator.&#xD;&#xD;Upvars ncomps and nswaps return a count of the number of calls to the comparator, and the number of times a pair of items is swapped. </comment><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%predRing"></input><input type="%upvar"></input><input type="%upvar"></input></inputs><script><custom-block s="quick sort from: %n to: %n of list: %l with %predRing comps: %upvar swaps: %upvar"><l>1</l><block s="reportListLength"><block var="list"/></block><block var="list"/><block var="comparator:"/><l>nc</l><l>ns</l></custom-block><block s="doSetVar"><l>ncomps</l><block var="nc"/></block><block s="doSetVar"><l>nswaps</l><block var="ns"/></block></script></block-definition><block-definition s="quick sort from: %&apos;lo&apos; to: %&apos;hi&apos; of list: %&apos;list&apos; with %&apos;comparator:&apos; comps: %&apos;nc&apos; swaps: %&apos;ns&apos;" type="command" category="lists"><comment w="305" collapsed="false">This is the real quicksort implementation, which:&#xD;* picks item[lo] as the &apos;pivot&apos;&#xD;* swaps within the range lo...hi to become (&lt;pivot)pivot(&gt;pivot)&#xD;* recursively sorts subranges (&lt;pivot) and (&gt;pivot)&#xD;The main quicksort wrapper just calls this on the range of the full list</comment><header></header><code></code><translations></translations><inputs><input type="%n"></input><input type="%n"></input><input type="%l"></input><input type="%predRing"></input><input type="%upvar"></input><input type="%upvar"></input></inputs><script><block s="doWarp"><script><block s="doDeclareVariables"><list><l>n</l><l>pivi</l><l>bigi</l></list></block><block s="doSetVar"><l>nc</l><l>0</l></block><block s="doSetVar"><l>ns</l><l>0</l></block><block s="doSetVar"><l>n</l><block s="reportSum"><block s="reportDifference"><block var="hi"/><block var="lo"/></block><l>1</l><comment w="191.99999999999994" collapsed="false">number of elements in the range lo...hi</comment></block></block><block s="doIf"><block s="reportEquals"><block var="n"/><l>2</l><comment w="114" collapsed="false">If the range is just two, compare them and swap if out of order. Count 1 comparator call for sure, and maybe one swap</comment></block><script><block s="doChangeVar"><l>nc</l><l>1</l></block><block s="doIf"><block s="evaluate"><block var="comparator:"/><list><block s="reportListItem"><block var="hi"/><block var="list"/></block><block s="reportListItem"><block var="lo"/><block var="list"/></block></list></block><script><custom-block s="swap item: %n and item: %n of list: %l"><block var="lo"/><block var="hi"/><block var="list"/></custom-block><block s="doChangeVar"><l>ns</l><l>1</l></block></script></block></script></block><block s="doIf"><block s="reportGreaterThan"><block var="n"/><l>2</l><comment w="335.8203125" collapsed="false">For a larger range, we pick a pivot and reorder the range &lt; and &gt; the pivot.&#xD;Note there is no if for n=0 or 1, so for those base cases the function do nothing and return. </comment></block><script><block s="doSetVar"><l>pivi</l><block var="lo"/></block><block s="doSetVar"><l>bigi</l><block var="hi"/></block><block s="doRepeat"><block s="reportDifference"><block var="n"/><l>1</l></block><script><block s="doIfElse"><block s="evaluate"><block var="comparator:"/><list><block s="reportListItem"><block var="pivi"/><block var="list"/></block><block s="reportListItem"><block s="reportSum"><block var="pivi"/><l>1</l></block><block var="list"/></block></list><comment w="276" collapsed="false">Compare the pivot and the next element. If they are in order...</comment></block><script><custom-block s="swap item: %n and item: %n of list: %l"><block s="reportSum"><block var="pivi"/><l>1</l></block><block var="bigi"/><block var="list"/><comment w="277" collapsed="false">...then the next element belongs on the big side of the pivot; swap it to the big side and decrement the big-side index </comment></custom-block><block s="doChangeVar"><l>bigi</l><l>-1</l></block></script><script><custom-block s="swap item: %n and item: %n of list: %l"><block var="pivi"/><block s="reportSum"><block var="pivi"/><l>1</l></block><block var="list"/><comment w="276" collapsed="false">...else the next element belongs on the small side of the pivot; swap it behind the pivot and increment the pivot </comment></custom-block><block s="doChangeVar"><l>pivi</l><l>1</l></block></script></block><block s="doChangeVar"><l>nc</l><l>1</l><comment w="166" collapsed="false">We just called the comparator once, and swapped once. </comment></block><block s="doChangeVar"><l>ns</l><l>1</l></block></script></block><custom-block s="quick sort from: %n to: %n of list: %l with %predRing comps: %upvar swaps: %upvar"><block var="lo"/><block s="reportDifference"><block var="pivi"/><l>1</l></block><block var="list"/><block var="comparator:"><comment w="280" collapsed="false">Recursively sort the subrange less than the pivot </comment></block><l>ncomps</l><l>nswaps</l></custom-block><block s="doChangeVar"><l>nc</l><block var="ncomps"/></block><block s="doChangeVar"><l>ns</l><block var="nswaps"/></block><custom-block s="quick sort from: %n to: %n of list: %l with %predRing comps: %upvar swaps: %upvar"><block s="reportSum"><block var="pivi"/><l>1</l></block><block var="hi"/><block var="list"/><block var="comparator:"/><l>ncomps</l><l>nswaps</l><comment w="282" collapsed="false">Recursively sort the subrange greater than the pivot</comment></custom-block><block s="doChangeVar"><l>nc</l><block var="ncomps"/></block><block s="doChangeVar"><l>ns</l><block var="nswaps"/></block></script></block></script></block></script></block-definition></blocks><variables><variable name="thelist"><list struct="atomic" id="401">6,2,3,1,4,5,10,7,8,9</list></variable><variable name="COMPS"><l>0</l></variable><variable name="SWAPS"><l>0</l></variable></variables></project><media name="Bubble/Quick" app="Snap! 6, https://snap.berkeley.edu" version="1"></media></snapdata>