Advertisement
Ladies_Man

Сортировка сл-ем на сопрограммах Concurrent_mergesort

Mar 11th, 2014
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 1.16 KB | None | 0 0
  1. //сортировка слиянием
  2. package main
  3. import "fmt"
  4.  
  5. var i, n, x int
  6. var arr []int
  7.  
  8. func mergesort (first int, last int, ch chan int) {
  9.  
  10.     if first >= last {
  11.         ch <- arr[first]
  12.         close(ch)
  13.     } else {
  14.         var a, b, t_a, t_b, mid int = 0, 0, 0, 0, (first + last) / 2
  15.         var chan1, chan2 = make(chan int), make(chan int)
  16.  
  17.         go mergesort(first, mid, chan1)
  18.         go mergesort(mid + 1, last, chan2)
  19.  
  20.         a, ok1 := <-chan1
  21.         b, ok2 := <-chan2
  22.  
  23.         for (ok1 || ok2) && (p != 3) {
  24.             if ok1 && ok2 {
  25.                 if a < 0 { t_a = -a } else { t_a = a }
  26.                 if b < 0 { t_b = -b } else { t_b = b }
  27.                 if t_a > t_b {
  28.                     ch <- b
  29.                     b, ok2 = <-chan2
  30.                 } else {
  31.                     ch <- a
  32.                     a, ok1 = <-chan1
  33.                 }
  34.             }
  35.                         if ok1 && !ok2 {
  36.                 ch <- a
  37.                 a, ok1 = <-chan1
  38.             }
  39.             if ok2 && !ok1 {
  40.                 ch <- b
  41.                 b, ok2 = <-chan2
  42.             }  
  43.         }
  44.         close(ch)
  45.     }
  46. }
  47.  
  48. func main() {
  49.     input.Scanf("%d", &n)
  50.     arr = make([]int, n)
  51.     for i = 0; i < n; i++ { input.Scanf("%d", &arr[i]) }
  52.     if 1 == n {
  53.         fmt.Printf("%d", arr[0])
  54.         return
  55.     }
  56.         ch := make(chan int)
  57.     go mergesort(0, n - 1, ch)
  58.    
  59.     for i = 0; i < n; i++ { fmt.Printf("%d ", <-ch) }
  60. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement