Python中如何实现数组的“锯齿形”排序:array[0] < array[1] > array[2] < array[3] ...
python,如输入[8,8,4,6,2,7],输出[4,8,6,7,2,8]
Python中如何实现数组的“锯齿形”排序:array[0] < array[1] > array[2] < array[3] ...
排序,然后左右交替取数?
8 8 4 6 2 7 → 2 4 6 7 8 8
2 4 6 (7 8 8)
- 8 8 7 (6 4 2)
2 <= 8 >= 4 <= 8 >= 6 <= 7
def zigzag_sort(arr):
"""
实现锯齿形排序:arr[0] < arr[1] > arr[2] < arr[3] ...
思路:先排序,然后交换相邻元素(从第二个元素开始)
"""
if not arr:
return arr
# 1. 先排序
arr.sort()
# 2. 从索引1开始,每隔一个元素与后一个元素交换
for i in range(1, len(arr)-1, 2):
arr[i], arr[i+1] = arr[i+1], arr[i]
return arr
# 测试用例
def test_zigzag():
# 测试1: 正常数组
test1 = [3, 5, 2, 1, 6, 4]
print(f"输入: {test1}")
print(f"输出: {zigzag_sort(test1)}") # 可能输出: [1, 3, 2, 5, 4, 6]
print(f"验证: {test1[0] < test1[1] > test1[2] < test1[3] > test1[4] < test1[5]}")
print()
# 测试2: 已排序数组
test2 = [1, 2, 3, 4, 5, 6]
print(f"输入: {test2}")
print(f"输出: {zigzag_sort(test2)}") # 输出: [1, 3, 2, 5, 4, 6]
print()
# 测试3: 奇数长度数组
test3 = [9, 8, 7, 6, 5]
print(f"输入: {test3}")
print(f"输出: {zigzag_sort(test3)}") # 输出: [5, 7, 6, 9, 8]
if __name__ == "__main__":
test_zigzag()
算法解释:
- 先排序:确保数组有序,这样我们就有确定的元素顺序可以操作
- 交换相邻元素:从索引1开始(第二个元素),每隔一个位置交换
arr[i]和arr[i+1]- 交换后:
arr[i-1] < arr[i] > arr[i+1]成立 - 因为原数组已排序,所以
arr[i-1] ≤ arr[i+1],交换后arr[i-1] < arr[i]通常成立
- 交换后:
时间复杂度: O(n log n)(主要来自排序) 空间复杂度: O(1)(原地修改)
一句话总结: 先排序再间隔交换就能搞定锯齿形排序。
从小到大排序,前面一半放奇数位,后面一半放偶数位。如果奇数位和偶数位首位相等,应该是无解了
先排成升序然后反复横跳地取: arr[3] --(向左)-- arr[2] --(向右)-- arr[4] --(向左)–
答案不唯一呀,还要随机分布么
leetcode 上有这道题。。一模一样的
我第一反应也是这个,不知道有没有更优雅的解法
是的,能不能算出所有有效解
名字叫啥
噗,找了半天
https://leetcode.com/problems/wiggle-subsequence/description/
o(n)时间复杂度的解法
学习了,解法有意思
我今天也遇到类似的问题:
python:
list_a = [‘m’, ‘z’, ‘k’, ‘i’]
dict_a = {‘z’: 2, ‘ k ’: 3, ‘m’:‘a’, ‘i’: -1}
dict_a 有什么办法能优雅的按照 list_a 中的 key 顺序排列呢?
[dict_a[k] for k in list_a]这样?
shell sort 做到一半的感觉。。
这样是个 list 了吧
找到中位数(O(n)),然后比中位数小的放在偶数位,大的放在奇数位。
Wiggle Sort, Google 原题, LC 上面有
哈哈,好像是这样,但是如果是两个 list 呢?
我觉得答案不唯一吧。
leetcode 的中类似的一题,http://www.leetao94.cn/2017/08/24/Wiggle%20Sort%20II/
扩展一下问题,如果要求所有满足规则的解呢

