quicksort.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package main
  2. import (
  3. "fmt"
  4. "math/rand"
  5. "time"
  6. )
  7. type ints []int
  8. func (is ints) less(i, j int) bool { return is[i] < is[j] }
  9. func (is ints) swap(i, j int) { is[i], is[j] = is[j], is[i] }
  10. func (is ints) getN(n int) int { // Get the Nth smallest number.
  11. l := len(is)
  12. lo, hi := 0, l-1
  13. for lo <= hi {
  14. m := is.partition(lo, hi)
  15. if m == n-1 {
  16. return is[m]
  17. } else if m < n-1 {
  18. lo = m + 1
  19. } else {
  20. hi = m - 1
  21. }
  22. }
  23. return is[lo]
  24. }
  25. func (is ints) sort() {
  26. l := len(is)
  27. rand.Shuffle(l, is.swap)
  28. is.qsort(0, l-1)
  29. }
  30. func (is ints) qsort(lo, hi int) {
  31. if hi <= lo {
  32. return
  33. }
  34. m := is.partition(lo, hi)
  35. is.qsort(lo, m-1)
  36. is.qsort(m+1, hi)
  37. }
  38. func (is ints) partition(lo, hi int) int {
  39. i, j := lo, hi+1
  40. for {
  41. for i++; is.less(i, lo) && i != hi; i++ {
  42. }
  43. for j--; is.less(lo, j) && j != lo; j-- {
  44. }
  45. if j <= i {
  46. break
  47. }
  48. is.swap(i, j)
  49. }
  50. is.swap(lo, j)
  51. return j
  52. }
  53. func main() {
  54. var n int
  55. fmt.Scan(&n)
  56. rand.Seed(time.Now().Unix())
  57. var list ints = make([]int, n)
  58. for i := range list {
  59. list[i] = rand.Intn(2 * n)
  60. }
  61. fmt.Println(list)
  62. m := list.getN(n / 2)
  63. list.sort()
  64. fmt.Println(list)
  65. fmt.Println(m, list[n/2-1])
  66. }