Topic tags
- f# × 3707
- websharper × 2884
- core × 418
- bolero × 329
- compiler × 291
- enhancement × 215
- functional × 201
- bug × 177
- ui next × 140
- ui × 132
- c# × 122
- classes × 97
- web × 97
- .net × 84
- book × 84
- async × 77
- ui.next × 67
- templates × 58
- website × 51
- trywebsharper × 50
- question × 46
- html × 45
- server × 45
- owin × 44
- javascript × 43
- parallel × 43
- parsing × 41
- testing × 41
- typescript × 39
- template × 38
- sitelet × 31
- asynchronous × 30
- feature request × 28
- monad × 28
- ocaml × 28
- warp × 28
- tutorial × 27
- haskell × 26
- dotnet-ws × 23
- linq × 22
- sitelets × 22
- workflows × 22
- rpc × 21
- getting started × 20
- wpf × 20
- fpish × 19
- introduction × 19
- silverlight × 19
- monodevelop × 17
- piglets × 17
- suave × 17
- docs × 16
- collections × 15
- jquery × 15
- proposal × 15
- aspnetcore × 14
- pipeline × 14
- reactive × 14
- 4.6.0.361 × 13
- documentation × 13
- kendoui × 13
- formlets × 12
- 4.1.0.171 × 11
- monads × 11
- released: v0.1 × 11
- websocket × 11
- 4.4.0.280 × 10
- 4.4.1.288 × 10
- opinion × 10
- tryfsharponwasm × 10
- 4.0.190.100-rc × 9
- deployment × 9
- fixed × 9
- in × 9
- json × 9
- plugin × 9
- scheme × 9
- solid × 9
- wontfix × 9
- 4.3.0.274 × 8
- 4.5.4.317 × 8
- basics × 8
- concurrent × 8
- highcharts × 8
- how-to × 8
- mvu × 8
- python × 8
- released: v0.11 × 8
- 4.1.1.175 × 7
- 4.5.1.304 × 7
- complexity × 7
- remoting × 7
- visual studio × 7
- 4.1.2.178 × 6
- 4.5.4.151 × 6
- authentication × 6
- datefns × 6
- lisp × 6
- real-world × 6
- released in 4.0.192.103-rc × 6
- resources × 6
- scala × 6
- websharper ui.next × 6
- workshop × 6
- xaml × 6
- 4.0.193.110 × 5
- 4.2.11.258 × 5
- 4.2.3.236 × 5
- aspnetmvc × 5
- azure × 5
- bootstrap × 5
- conference × 5
- css × 5
- dsl × 5
- formlet × 5
- java × 5
- list × 5
- metaprogramming × 5
- ml × 5
- q&a × 5
- released in Zafir.4.0.188.91-beta10 × 5
- released: v0.4 × 5
- released: v0.8 × 5
- spa × 5
- sql × 5
- visualstudio × 5
- websharper.forms × 5
- zafir × 5
- 4.0.192.106 × 4
- 4.0.195.127 × 4
- 4.1.0.38 × 4
- 4.2.1.86 × 4
- 4.2.13.263 × 4
- 4.2.6.118 × 4
- 4.5.5.155 × 4
- 4.6.4.404 × 4
- discussion × 4
- example × 4
- extension × 4
- extensions × 4
- fsi × 4
- fsx × 4
- help wanted × 4
- highlightjs × 4
- html5 × 4
- jqueryui × 4
- lift × 4
- performance × 4
- qna × 4
- react × 4
- reflection × 4
- released: v0.10 × 4
- released: v0.5 × 4
- remote × 4
- rest × 4
- teaching × 4
- todomvc × 4
- 4.0.196.147 × 3
- 4.1.0.34 × 3
- 4.1.6.207 × 3
- 4.2.1.223-beta × 3
- 4.2.14.264 × 3
- 4.2.4.114 × 3
- 4.2.4.247 × 3
- 4.2.5.115 × 3
- 4.2.6.253 × 3
- 4.2.9.256 × 3
- 4.5.0.140 × 3
- 4.5.0.290 × 3
- 4.5.18.348 × 3
- 4.5.2.309 × 3
- 4.5.8.327 × 3
- 4.6.2.386 × 3
- ajax × 3
- alt.net × 3
- aml × 3
- asp.net mvc × 3
- build × 3
- canvas × 3
- cloudsharper × 3
- compilation × 3
- d3 × 3
- data × 3
- database × 3
- erlang × 3
- events × 3
- file upload × 3
- forums × 3
- how to × 3
- http × 3
- inline × 3
- issue × 3
- kendo × 3
- macro × 3
- materialui × 3
- mono × 3
- msbuild × 3
- mvc × 3
- pattern × 3
- piglet × 3
- released in Zafir.4.0.187.90-beta10 × 3
- released: v0.12 × 3
- released: v0.9 × 3
- svg × 3
- type provider × 3
- view × 3
- websharper4 × 3
- 4.1.1.64 × 2
- 4.1.5.203 × 2
- 4.1.7.232 × 2
- 4.2.10.257 × 2
- 4.2.3.111 × 2
- 4.2.5.249 × 2
- 4.3.0.127 × 2
- 4.3.1.275 × 2
- 4.5.10.166 × 2
- 4.5.10.332 × 2
- 4.5.15.342 × 2
- 4.5.19.349 × 2
- 4.5.3.146 × 2
- 4.5.9.301 × 2
- android × 2
- api × 2
- asp.net × 2
- beginner × 2
- blog × 2
- chart × 2
- client × 2
- client server app × 2
- clojure × 2
- computation expressions × 2
- constructor × 2
- corporate × 2
- courses × 2
- cufp × 2
- debugging × 2
- direct × 2
- discriminated union × 2
- dom × 2
- elm × 2
- endpoint × 2
- endpoints × 2
- enterprise × 2
- entity framework × 2
- event × 2
- f# interactive × 2
- fable × 2
- flowlet × 2
- formdata × 2
- forms × 2
- fsc × 2
- fsharp × 2
- google × 2
- google maps × 2
- hosting × 2
- https × 2
- iis 8.0 × 2
- install × 2
- interactive × 2
- interface × 2
- iphone × 2
- iteratee × 2
- jobs × 2
- jquery mobile × 2
- keynote × 2
- lens × 2
- lenses × 2
- linux × 2
- listmodel × 2
- mac × 2
- maps × 2
- numeric × 2
- oauth × 2
- obfuscation × 2
- offline × 2
- oop × 2
- osx × 2
- packaging × 2
- pattern matching × 2
- pipelines × 2
- post × 2
- quotation × 2
- reference × 2
- released in Zafir.4.0.185.88-beta10 × 2
- released: v0.13 × 2
- released: v0.6 × 2
- remarkable × 2
- rx × 2
- script × 2
- security × 2
- self host × 2
- seq × 2
- sockets × 2
- stm × 2
- sweetalert × 2
- tcp × 2
- trie × 2
- tutorials × 2
- type × 2
- url × 2
- var × 2
- websharper.charting × 2
- websockets × 2
- wig × 2
- xna × 2
- zh × 2
- .net framework × 1
- .net interop × 1
- 2012 × 1
- 4.0.194.126 × 1
- 4.1.3.184 × 1
- 4.1.4.189 × 1
- 4.2.0.214-beta × 1
- 4.2.12.259 × 1
- 4.2.2.231-beta × 1
- 4.2.8.255 × 1
- 4.4.1.137 × 1
- 4.5.1.141 × 1
- 4.5.11.334 × 1
- 4.5.12.177 × 1
- 4.5.13.318 × 1
- 4.5.13.338 × 1
- 4.5.16.344 × 1
- 4.5.2.145 × 1
- 4.5.3.144 × 1
- 4.5.3.310 × 1
- 4.5.5.319 × 1
- 4.5.6.156 × 1
- 4.5.6.320 × 1
- 4.5.7.322 × 1
- 4.5.8.161 × 1
- 4.5.9.164 × 1
- 4.6.1.127 × 1
- 4.6.1.381 × 1
- 4.6.3.388 × 1
- 4.6.5.406 × 1
- 4.6.6.407 × 1
- Canvas Sample Example × 1
- DynamicStyle Animated Style × 1
- ES8 × 1
- Fixed in 4.0.190.100-rc × 1
- Metro-Ui-Css × 1
- Metro4 × 1
- Released in Zafir.UI.Next.4.0.169.79-beta10 × 1
- SvgDynamicAttribute × 1
- Swiper × 1
- WebComponent × 1
- WebSharper.TypeScript × 1
- abstract class × 1
- accumulator × 1
- active pattern × 1
- actor × 1
- addin × 1
- agents × 1
- aggregation × 1
- agile × 1
- alter session × 1
- animation × 1
- anonymous object × 1
- apache × 1
- appcelerator × 1
- architecture × 1
- array × 1
- arrays × 1
- asp.net 4.5 × 1
- asp.net core × 1
- asp.net integration × 1
- asp.net mvc 4 × 1
- asp.net web api × 1
- aspnet × 1
- ast × 1
- attributes × 1
- authorization × 1
- b-tree × 1
- back button × 1
- badimageformatexception × 1
- bash script × 1
- batching × 1
- binding-vars × 1
- bistro × 1
- body × 1
- bundle × 1
- camtasia studio × 1
- cas protocol × 1
- charts × 1
- clarity × 1
- class × 1
- cli × 1
- clipboard × 1
- clojurescript × 1
- closures × 1
- cloud × 1
- cms × 1
- code-review × 1
- coding diacritics × 1
- color highlighting × 1
- color zones × 1
- combinator × 1
- combinators × 1
- compile × 1
- compile code on server × 1
- config × 1
- confirm × 1
- content × 1
- context × 1
- context.usersession × 1
- continuation-passing style × 1
- coords × 1
- cordova × 1
- cors × 1
- coursera × 1
- cross-domain × 1
- csla × 1
- current_schema × 1
- custom content × 1
- data grid × 1
- datetime × 1
- debug × 1
- declarative × 1
- delete × 1
- devexpress × 1
- dhtmlx × 1
- dictionary × 1
- directattribute × 1
- disqus × 1
- distance × 1
- do binding × 1
- doc elt ui.next upgrade × 1
- docker × 1
- dojo × 1
- dol × 1
- domain × 1
- dotnet core × 1
- du × 1
- duf-101 × 1
- dynamic × 1
- eastern language × 1
- eclipse × 1
- edsl × 1
- em algorithm × 1
- emacs × 1
- emotion × 1
- enums × 1
- error × 1
- etw × 1
- euclidean × 1
- eventhandlerlist × 1
- examples × 1
- ext js × 1
- extension methods × 1
- extjs × 1
- extra × 1
- facet pattern × 1
- failed to translate × 1
- fake × 1
- fantomas × 1
- fear × 1
- float × 1
- form × 1
- form-data × 1
- forum × 1
- fp × 1
- frank × 1
- fsdoc × 1
- fsharp.core × 1
- fsharp.powerpack × 1
- fsharpx × 1
- fsunit × 1
- function × 1
- functional style × 1
- game × 1
- games × 1
- gc × 1
- generic × 1
- geometry × 1
- getlastwin32error × 1
- getting-started × 1
- good first issue × 1
- google visualization timeline × 1
- google.maps × 1
- grid × 1
- group × 1
- guide × 1
- hash × 1
- headers × 1
- hello world example × 1
- heroku × 1
- highchart × 1
- history × 1
- html-templating × 1
- http405 × 1
- httpcontext × 1
- hubfs × 1
- i18n × 1
- ide × 1
- ie 8 × 1
- if-doc × 1
- iis × 1
- image × 1
- images × 1
- inheritance × 1
- initialize × 1
- input × 1
- install "visual studio" × 1
- installer × 1
- int64 × 1
- interfaces × 1
- internet explorer × 1
- interop × 1
- interpreter × 1
- invalid × 1
- io × 1
- iobservable × 1
- ios × 1
- iot × 1
- ipad × 1
- isomorphic × 1
- javascript optimization × 1
- javascript semanticui resources × 1
- jquery-plugin × 1
- jquery-ui × 1
- jquery-ui-datepicker × 1
- jquerymobile × 1
- js × 1
- kendo datasource × 1
- kendochart × 1
- kendoui compiler × 1
- knockout × 1
- l10n × 1
- leaflet × 1
- learning × 1
- library × 1
- libs × 1
- license × 1
- licensing × 1
- lineserieszonescfg × 1
- local setting × 1
- localization × 1
- logging × 1
- loop × 1
- macros × 1
- mailboxprocessor × 1
- mapping × 1
- markerclusterer × 1
- markup × 1
- marshal × 1
- math × 1
- mathjax × 1
- message × 1
- message passing × 1
- message-passing × 1
- meta × 1
- metro style × 1
- metro-ui × 1
- micro orm × 1
- minimum-requirements × 1
- mix × 1
- mobile installation × 1
- mod_mono × 1
- modal × 1
- module × 1
- mouseevent × 1
- mouseposition × 1
- multidimensional × 1
- multiline × 1
- multithreading × 1
- mysql × 1
- mysqlclient × 1
- nancy × 1
- native × 1
- nested × 1
- nested loops × 1
- netstandard × 1
- node × 1
- nunit × 1
- object relation mapper × 1
- object-oriented × 1
- om × 1
- onboarding × 1
- onclick × 1
- optimization × 1
- option × 1
- orm × 1
- os x × 1
- output-path × 1
- override × 1
- paper × 1
- parameter × 1
- persistence × 1
- persistent data structure × 1
- phonegap × 1
- plotly × 1
- pola × 1
- powerpack × 1
- prefix tree × 1
- principle of least authority × 1
- privacy × 1
- private × 1
- profile × 1
- programming × 1
- project × 1
- project euler × 1
- projekt_feladat × 1
- protected × 1
- provider × 1
- proxy × 1
- ptvs × 1
- public × 1
- pure f# × 1
- purescript × 1
- quant × 1
- query sitelet × 1
- quotations × 1
- range × 1
- raphael × 1
- razor × 1
- rc × 1
- reactjs × 1
- real-time × 1
- ref × 1
- region × 1
- released in 4.0.190.100-rc × 1
- released: v0.2 × 1
- released: v0.3 × 1
- released: v0.7 × 1
- reporting × 1
- responsive design × 1
- rest api × 1
- rest sitelet × 1
- restful × 1
- round table × 1
- router × 1
- routing × 1
- rpc reverseproxy × 1
- runtime × 1
- sales × 1
- sample × 1
- sampleapp × 1
- scriptcs × 1
- scripting × 1
- search × 1
- self hosted × 1
- semanticui × 1
- sequence × 1
- serialisation × 1
- service × 1
- session-state × 1
- sharepoint × 1
- signals × 1
- sitelet website × 1
- sitelet.protect × 1
- sitlets × 1
- slickgrid × 1
- source code × 1
- sqlentityconnection × 1
- ssl × 1
- standards × 1
- static content × 1
- stickynotes × 1
- streamreader × 1
- stress × 1
- strong name × 1
- structures × 1
- submitbutton × 1
- subscribe × 1
- svg example html5 websharper.ui.next × 1
- system.datetime × 1
- system.reflection.targetinvocationexception × 1
- table storage × 1
- targets × 1
- tdd × 1
- template ClientServer × 1
- templates ui.next × 1
- templating × 1
- text parsing × 1
- three.js × 1
- time travel × 1
- tls × 1
- tooltip × 1
- tracing × 1
- tsunamiide × 1
- turkish × 1
- twitter-bootstrap × 1
- type erasure × 1
- type inference × 1
- type providers × 1
- type-providers × 1
- typeprovider × 1
- ui next forms × 1
- ui-next × 1
- ui.next jqueryui × 1
- ui.next charting × 1
- ui.next formlets × 1
- ui.next forms × 1
- ui.next suave visualstudio × 1
- ui.next templating × 1
- unicode × 1
- unittest client × 1
- up for grabs × 1
- upload × 1
- usersession × 1
- validation × 1
- vb × 1
- vb.net × 1
- vector × 1
- view.map × 1
- visal studio × 1
- visual f# × 1
- visual studio 11 × 1
- visual studio 2012 × 1
- visual studio code × 1
- visual studio shell × 1
- visualstudio-websharper × 1
- vs2017 compiler zafir × 1
- vsix × 1
- web api × 1
- web-scraping × 1
- webapi × 1
- webcomponents × 1
- webforms × 1
- webgl × 1
- webrtc × 1
- webshaper × 1
- websharper async × 1
- websharper codemirror × 1
- websharper f# google × 1
- websharper forms × 1
- websharper reactive × 1
- websharper rpc × 1
- websharper sitelets routing × 1
- websharper warp × 1
- websharper-interface-generator × 1
- websharper.chartsjs × 1
- websharper.com × 1
- websharper.exe × 1
- websharper.owin × 1
- websharper.ui.next × 1
- websharper.ui.next jquery × 1
- websockets iis × 1
- webspeech × 1
- why-websharper × 1
- windows 7 × 1
- windows 8 × 1
- windows-phone × 1
- winrt × 1
- www.grabbitmedia.com × 1
- xamarin × 1
- xml × 1
- yeoman × 1
- yield × 1
- zafir beta × 1
- zafir websharper4 × 1
- zarovizsga × 1
|
Copyright (c) 2011-2012 IntelliFactory. All rights reserved. Home | Products | Consulting | Trainings | Blogs | Jobs | Contact Us | Terms of Use | Privacy Policy | Cookie Policy |
Built with WebSharper |







Dusted off my copy of Sedgwick's Algorithms and decided to implement some of the sorts described therein to dig in to F#. These are heavy on imperitive features, but the intention here is to arrive at efficient library-quility code.
On the other hand, I had a bit of functional fun with the test driver code!
I hope these are worthy of posting here, since I finally managed to beat the standard .NET libraries with both quicksort and shellsort. Man is quicksort hard to get right!
Shellsort tends to perform very well with small arrays, running in as little as 10% of the time as the stock sort for 100 sorted elements and 86% of the time for 10,000 elements. It tends to outperform even quicksort when the input is mostly sorted or reverse sorted.
Quicksort is almost 2x faster than the .NET library sort above 1,000 elements in the random and forward ordered cases, but only a bit more than 10% faster in the reverse ordered case. It uses a stack of about log2 N keys. Note that it is *slower* than the .NET library for 100 random elements or less, but is still faster for sorted and reverse input at that level.
See the attached project files for copyright, etc.
Feedback most welcome!
sort.fsi
/// This stable in-place sort has the important characteristic that each element /// is only moved once. Therefore, it is useful for arrays with very large /// elements. Runtime tends to be stable regardless of the original order. /// /// Uses about N^2/2 comparisons and N exchanges. Complexity is O(N log N) /// on average, O(N^2) in the worst case, and linear for arrays with small keys /// and large elements. val selectionsort : ('a -> 'a -> int) -> 'a array -> unit /// Another in-place stable sort, this routine is ideal for arrays that are /// already mostly ordered. In fact, this sort is often used as a final step in /// quicksort, rather than having the latter fully order the array. /// Performs poorly when elements are in reverse order. /// /// Uses around N^2/4 comparisons and about N^2/8 exchanges, with N^2/4 in the /// worst case. Complexity is linear for "almost" sorted files, but quadratic /// for files in reverse order. val insertionsort : ('a -> 'a -> int) -> 'a array -> unit /// Added for comparison, this calls the F# default sort, which internally /// calls the .NET BCL Array.Sort method. Performs slightly better than /// this library's shellsort on random data with 10,000 or more elements, /// but worse on mostly ordered data, even if in reverse order. /// /// Complexity is unknown, but based on performance the implementation is /// suspected to be a form of shell sort. val stocksort : ('a -> 'a -> int) -> 'a array -> unit /// An unstable in-place sort with excellent performance characteristics. Based /// on the insertion sort, but modified to rapidly move elements over large /// distances. Tends to outperfom Array.Sort and Quicksort for small arrays /// (up to 1,000s of records), and outperforms Array.Sort most of the time. /// Not particularaly sensitive to initial ordering. /// /// This implementation never does more than N^3/2 comparisons. The exact /// complexity is not known, but suspected to be either N(log2 N)^2 or N^1.25. val shellsort : ('a -> 'a -> int) -> 'a array -> unit /// This is the fastest sort in the library, but is both unstable and requires a /// small supplementary stack of about log2 N indicies. Due to overhead, not /// recommended for 100s of records or less (use shellsort instead). /// Tends not to perform as well as shellsort when records are in reverse /// order. /// /// Uses 1.38N(log2 N) comparisons on average, with a very tight inner loop. /// Tends to avoid the worst case of O(N^2) and gains about 5% performance by /// using a "median-of-three partitioning" algorithm. For an additional savings /// of about 20%, only orders partitions with more than 21 elements; an insertion /// sort is used as a last step on the "almost" sorted result. val quicksort : ('a -> 'a -> int) -> 'a array -> unitsort.fs
#light open System let selectionsort f a = let N = (Array.length a) - 1 for i = 0 to N do let mutable minIx = i for j = i+1 to N do if (f a.[j] a.[minIx]) < 0 then minIx <- j if minIx <> i then let t = a.[ i ] a.[ i ] <- a.[minIx] a.[minIx] <- t let insertionsort f a = let N = (Array.length a) - 1 for i = 1 to N do let v = a.[ i ] let mutable j = i while (j>0) && (f a.[j-1] v) > 0 do a.[j] <- a.[j-1] j <- j - 1 a.[j] <- v let shellsort f a = let N = Array.length a - 1 let mutable width = 1 while width <= N do width <- 3*width+1 width <- width / 3 while width >= 1 do for i = width to N do let v = a.[ i ] let mutable j = i while j>=width && (f a.[j-width] v) > 0 do a.[j] <- a.[j-width] j <- j-width a.[j] <- v width <- width / 3 let stocksort f a = Array.sort f a let quicksortM M fn a = let N = Array.length a - 1 let mutable stack = [0,0] let mutable l = 0 let mutable r = N let swap x y = let t = a.[ x ] a.[ x ] <- a.[ y ] a.[ y ] <- t let sort3 x y z = if a.[ x ] > a.[ y ] then swap x y if a.[ x ] > a.[ z ] then swap x z if a.[ y ] > a.[ z ] then swap y z while stack <> [] do let count = (r-l)+1 #if DEBUG_QUICKSORT // Special case this for debugging to handle l=0 & r=1 if count = 2 then if a.[l] > a.[r] then swap l r else if count = 3 then // Median-of-three let m = l + 1 sort3 l m r else #endif if count > M then // Median-of-three let m = l + (r-l)/2 sort3 l m r let rm1 = r-1 swap m rm1 let v = a.[rm1] let mutable i = l let mutable j = rm1 while i <= j do i <- i + 1 while (fn a.[ i ] v) < 0 do i <- i + 1 j <- j - 1 while (fn a.[j] v) > 0 do j <- j - 1 swap i j swap j i a.[rm1] <- a.[ i ] a.[ i ] <- v if j-l > r-i then stack <- (l,j) :: stack l <- i + 1 else stack <- (i+1,r) :: stack r <- j else let tl,tr = List.hd stack stack <- List.tl stack l <- tl r <- tr #if DEBUG_QUICKSORT #else insertionsort fn a #endif // Emperical testing shows that 21 is a good all-around value for the quicksort // partition size on my laptop. let quicksort fn a = quicksortM 21 fn asorttests.fs
#light open Sort open System open System.Diagnostics let assertIsSorted a = let N = Array.length a - 1 let mutable min = a.[0] for i = 1 to N do if a.[ i ] >= min then min <- a.[ i ] else failwithf "Array is not sorted at index %i (%i > %i)" i min a.[ i ] done let assertAreEqual a b = if Array.length a <> Array.length b then failwithf "Array lengths are different: %i <> %i" (Array.length a) (Array.length b) a |> Array.iteri (fun ix v -> if v <> b.[ix] then failwithf "Array not equal at index %i (%i <> %i)" ix v b.[ix]) let rnd = new Random(); let stopw = new Stopwatch(); //-------------- let sorts = [ ("Stock F# Sort", stocksort); ("Quick Sort", quicksort); ("Shell Sort", shellsort); #if I_HAVE_LOTS_OF_TIME_FOR_ON2 ("Insertion Sort", insertionsort); ("Selection Sort", selectionsort); #endif ] let asc a b = (a-b) let dec a b = (b-a) //-------------- let sortDriver a sortfn = let b = Array.copy a System.GC.Collect(); stopw.Start() a |> sortfn asc stopw.Stop() b |> stocksort asc assertAreEqual a b let tests = [ yield! [for mag in 2 .. 7 ->> [ (sprintf "Random x 10^%i" mag, (fun () -> let N = (int (10.0**(float mag))) in [| for i in 0..N -> rnd.Next() |]) ) (sprintf "Sorted x 10^%i" mag, (fun () -> let N = (int (10.0**(float mag))) in [| for i in 0..N -> i |]) ) (sprintf "Reverse x 10^%i" mag, (fun () -> let N = (int (10.0**(float mag))) in [| for i in 0..N -> N-i |]) ) // (sprintf "Alternating x 10^%i" mag, (fun () -> let N = (int (10.0**(float mag))) in [| for i in 0..N -> i % 2 |]) ) // (sprintf "Alternating2 x 10^%i" mag, (fun () -> let N = (int (10.0**(float mag))) in [| for i in 0..N -> (i+1) % 2 |]) ) ] ] ] //-------------- for test in tests do printfn "%s:" (fst test) let mutable defaultMS = -1.0 for sort in sorts do printf "\t%s..." (fst sort) let N = 5 stopw.Reset() for iteration = 1 to N do System.Console.Write("."); System.Console.Out.Flush() let ar = (snd test)() let fn = snd sort sortDriver ar fn let avg = (stopw.Elapsed.TotalMilliseconds / (float N)) if defaultMS = -1.0 then defaultMS <- avg printfn "\tAvg. %fms (%i%%)" avg (int (avg*100.0 / defaultMS + 0.5 )) done printfn "" done Console.WriteLine( "Press <Enter> to continue..." ); Console.ReadKey() |> ignore;