题目:
题解:
def quickSelect(a: List[int], k: int) -> int:
seed(datetime.datetime.now())
shuffle(a)
l, r = 0, len(a) - 1
while l < r:
pivot = a[l]
i, j = l, r + 1
while True:
i += 1
while i < r and a[i] < pivot:
i += 1
j -= 1
while j > l and a[j] > pivot:
j -= 1
if i >= j:
break
a[i], a[j] = a[j], a[i]
a[l], a[j] = a[j], pivot
if j == k:
break
if j < k:
l = j + 1
else:
r = j - 1
return a[k]
class Solution:
def wiggleSort(self, nums: List[int]) -> None:
n = len(nums)
x = (n + 1) // 2
target = quickSelect(nums, x - 1)
transAddress = lambda i: (2 * n - 2 * i - 1) % (n | 1)
k, i, j = 0, 0, n - 1
while k <= j:
tk = transAddress(k)
if nums[tk] > target:
while j > k and nums[transAddress(j)] > target:
j -= 1
tj = transAddress(j)
nums[tk], nums[tj] = nums[tj], nums[tk]
j -= 1
if nums[tk] < target:
ti = transAddress(i)
nums[tk], nums[ti] = nums[ti], nums[tk]
i += 1
k += 1