| 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
 
- }
 
 
  |