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