|  | @@ -0,0 +1,50 @@
 | 
	
		
			
				|  |  | +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
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 |