1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- func wiggleSort(nums []int) {
- n := len(nums)
- if n <= 1 {
- return
- }
- mid := quickSelect(nums, n/2)
- idx := func(i int) int {
- return (2*i + 1) % (n | 1)
- }
- l, m, r := 0, 0, n-1
- for m <= r {
- if mid < nums[idx(m)] {
- swap(&nums[idx(l)], &nums[idx(m)])
- l, m = l+1, m+1
- } else if nums[idx(m)] < mid {
- swap(&nums[idx(m)], &nums[idx(r)])
- r--
- } else {
- m++
- }
- }
- }
- func quickSelect(nums []int, k int) int {
- l, r := 0, len(nums)-1
- rand.Seed(time.Now().Unix())
- for l < r {
- swap(&nums[l], &nums[rand.Intn(r-l+1)+l])
- m := l
- for i := l + 1; i <= r; i++ {
- if nums[i] < nums[l] {
- m++
- swap(&nums[m], &nums[i])
- }
- }
- swap(&nums[l], &nums[m])
- if k <= m {
- r = m - 1
- }
- if m <= k {
- l = m + 1
- }
- }
- return nums[k]
- }
- func swap(x, y *int) {
- *x, *y = *y, *x
- }
|