Advertisement
Guest User

Untitled

a guest
May 2nd, 2015
254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 1.98 KB | None | 0 0
  1. module MergeSort
  2. open System
  3. open System.Threading
  4. open System.Diagnostics
  5.  
  6. let Merge (arr:int[], left:int, middle:int, right:int) =
  7.     let mutable m1 = middle - left + 2
  8.     let mutable m2 = right - middle + 1
  9.     let L = Array.create m1 0
  10.     let R = Array.create m2 0
  11.     m1<-m1-1
  12.     m2<-m2-1
  13.     for i = 0 to m1-1 do L.[i] <- arr.[i+left]
  14.     for i=0 to m2-1 do R.[i] <- arr.[i+middle+1]
  15.     L.[m1]<-System.Int32.MaxValue
  16.     R.[m2]<-System.Int32.MaxValue
  17.     let mutable i = 0
  18.     let mutable j = 0
  19.  
  20.     for x=left to right do
  21.      if (L.[i]<R.[j]) then do
  22.       arr.[x]<-L.[i]
  23.       i<-i+1
  24.      else do
  25.       arr.[x]<-R.[j]
  26.       j<-j+1
  27.  
  28.  
  29. let rec Sort (threadMaxNumber:int , arr: int[], left:int, right:int) =
  30.     if (left < right && threadMaxNumber>1) then do
  31.        let middle = left + (right-left)/2
  32.        let t = new Thread(ThreadStart(fun _ -> Sort (threadMaxNumber/2, arr, left, middle)))
  33.        t.Start()
  34.        Sort(threadMaxNumber/2, arr, middle+1, right)
  35.        t.Join()
  36.        Merge(arr, left, middle, right)
  37.         else if (left<right) then do
  38.         let middle = left + (right-left)/2
  39.         Sort (threadMaxNumber/2, arr, left, middle)
  40.         Sort(threadMaxNumber/2, arr, middle+1, right)
  41.         Merge(arr, left, middle, right)
  42.  
  43.    
  44. let createArr (degree:float, threadNumber:int) =
  45.    let length = Int32.Parse(System.Math.Pow(10.0, degree).ToString())
  46.    let rnd = new System.Random(0)
  47.    let arr = Array.init length (fun i -> rnd.Next(0, length))
  48.    let timer = new System.Diagnostics.Stopwatch()
  49.    timer.Start()
  50.    Sort(threadNumber, arr, 0 , length-1)
  51.    timer.Stop()
  52.    let mutable a = 1
  53.    for x=0 to length-2 do
  54.     if (arr.[x]>arr.[x+1]) then a<-0
  55.    //printfn "%s %A" "Sorting time: " timer.Elapsed.TotalSeconds
  56.    a
  57.  
  58. [<EntryPoint>]
  59. let main argv =
  60.    
  61.     0 // return an integer exit code
  62.  
  63.  
  64. //[<TestCase (6.0,1, Result = 1)>]
  65. //[<TestCase (7.0,4, Result = 1)>]
  66. //let ``Test`` (d : float, t : int) =
  67.   //createArr d t
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement