324.wiggle-sort-ii.go 805 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. func wiggleSort(nums []int) {
  2. n := len(nums)
  3. if n <= 1 {
  4. return
  5. }
  6. mid := quickSelect(nums, n/2)
  7. idx := func(i int) int {
  8. return (2*i + 1) % (n | 1)
  9. }
  10. l, m, r := 0, 0, n-1
  11. for m <= r {
  12. if mid < nums[idx(m)] {
  13. swap(&nums[idx(l)], &nums[idx(m)])
  14. l, m = l+1, m+1
  15. } else if nums[idx(m)] < mid {
  16. swap(&nums[idx(m)], &nums[idx(r)])
  17. r--
  18. } else {
  19. m++
  20. }
  21. }
  22. }
  23. func quickSelect(nums []int, k int) int {
  24. l, r := 0, len(nums)-1
  25. rand.Seed(time.Now().Unix())
  26. for l < r {
  27. swap(&nums[l], &nums[rand.Intn(r-l+1)+l])
  28. m := l
  29. for i := l + 1; i <= r; i++ {
  30. if nums[i] < nums[l] {
  31. m++
  32. swap(&nums[m], &nums[i])
  33. }
  34. }
  35. swap(&nums[l], &nums[m])
  36. if k <= m {
  37. r = m - 1
  38. }
  39. if m <= k {
  40. l = m + 1
  41. }
  42. }
  43. return nums[k]
  44. }
  45. func swap(x, y *int) {
  46. *x, *y = *y, *x
  47. }