Advertisement
EWTD

Untitled

Sep 16th, 2021
1,590
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 1.64 KB | None | 0 0
  1. package main
  2.  
  3. import "fmt"
  4. type Pair struct {
  5.     first int
  6.     second int
  7. }
  8. type stack []Pair
  9. func (s *stack)Push(p Pair){
  10.     *s = append(*s, p)
  11. }
  12. func (s *stack)Pop() Pair{
  13.     if s.IsEmpty(){
  14.         panic(s)
  15.     }
  16.     l := len(*s)
  17.     res := (*s)[l-1]
  18.     *s = (*s)[:l-1]
  19.     return res
  20. }
  21. func (s *stack)IsEmpty() bool{
  22.     return len(*s) == 0
  23. }
  24. func partition(l int, r int, less func(i,j int) bool, swap func(i, j int)) int{
  25.     i := l
  26.     middle := (r+l)/2
  27.     j := r-1
  28.     for i <= j{
  29.         for less(i,middle){
  30.             i++
  31.         }
  32.         for less(middle,j){
  33.             j--
  34.         }
  35.         if i >= j{
  36.             break
  37.         }
  38.         if i == middle{
  39.             middle = j
  40.         }else if j == middle{
  41.             middle = i
  42.         }
  43.         swap(i,j)
  44.         i++
  45.         j--
  46.     }
  47.     return j
  48. }
  49. func qsort(n int, less func(i,j int) bool, swap func(i, j int)){
  50.     var s stack
  51.     s.Push(Pair{0,n})
  52.     for !s.IsEmpty() {
  53.         pair := s.Pop()
  54.         size := pair.second - pair.first
  55.         if size < 2 {
  56.             continue
  57.         }
  58.         median := (pair.second +pair.first)/2
  59.         if less(median, pair.first) {
  60.             swap(pair.first, median)
  61.         }
  62.         if less(pair.second-1, pair.first) {
  63.             swap(pair.second-1, pair.first)
  64.         }
  65.         if less(median, pair.second-1) {
  66.             swap(median, pair.second-1)
  67.         }
  68.         q := partition(pair.first,pair.second,less,swap)
  69.         if pair.first < q + 1 && q + 1 < pair.second{
  70.             s.Push(Pair{pair.first,q+1})
  71.             s.Push(Pair{q+1,pair.second})
  72.         }
  73.     }
  74. }
  75.  
  76. func main() {
  77.     var n, tmp int
  78.     var arr []int
  79.     fmt.Scan(&n)
  80.     for i := 0; i < n; i++{
  81.         fmt.Scan(&tmp)
  82.         arr = append(arr, tmp)
  83.     }
  84.     qsort(n,
  85.         func(i, j int) bool{
  86.             return arr[i] < arr[j]
  87.         },
  88.         func(i, j int){
  89.             arr[i], arr[j] = arr[j], arr[i]
  90.         })
  91.     for i:= 0; i < n; i++{
  92.         fmt.Printf("%d ",arr[i])
  93.     }
  94. }
  95.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement