排序算法之:波浪排序(Wave Sort)
字数 1112 2025-10-29 11:31:55

排序算法之:波浪排序(Wave Sort)

题目描述:
给定一个未排序的整数数组,你需要将其重新排列成"波浪形"排序。波浪排序要求数组元素交替排列,使得每个奇数索引(1, 3, 5...)的元素都大于或等于其相邻的两个元素,或者每个偶数索引(0, 2, 4...)的元素都小于或等于其相邻的两个元素。更具体地说,通常要求满足:nums[0] <= nums[1] >= nums[2] <= nums[3] >= nums[4]...

解题过程:

第一步:理解波浪排序的核心要求
波浪排序的核心模式是"小-大-小-大"交替排列。对于索引i:

  • 如果i是偶数,那么nums[i] <= nums[i+1](当i+1存在时)
  • 如果i是奇数,那么nums[i] >= nums[i+1](当i+1存在时)

第二步:分析问题特点
这个排序不需要完全有序,只需要满足局部的大小关系。我们可以利用这个特点设计更高效的算法。

第三步:选择解题策略
有两种主要方法:

  1. 排序后交换法:先排序再调整
  2. 一次遍历法:直接通过一次遍历调整位置

第四步:详细讲解排序后交换法

  1. 首先对数组进行升序排序
  2. 从索引1开始,每隔一个元素与后一个元素交换
  3. 具体操作:遍历所有奇数索引位置(1, 3, 5...),将当前元素与后一个元素交换

示例:数组[3, 2, 1, 4]

  • 排序后:[1, 2, 3, 4]
  • 交换索引1和2:得到[1, 3, 2, 4]
  • 验证:1<=3>=2<=4 ✓

第五步:详细讲解一次遍历法(更优解)
这种方法不需要完全排序,时间复杂度O(n):

  1. 遍历数组的所有偶数索引位置(0, 2, 4...)
  2. 对于每个位置i,检查三个条件:
    • 如果i>0且nums[i] > nums[i-1],交换nums[i]和nums[i-1]
    • 如果i<n-1且nums[i] > nums[i+1],交换nums[i]和nums[i+1]
  3. 实际上只需要保证每个偶数位置的值都不大于相邻位置即可

第六步:算法正确性证明
通过数学归纳法可以证明,这种方法能保证:

  • 所有偶数位置的值都不大于相邻的奇数位置值
  • 所有奇数位置的值都不小于相邻的偶数位置值

第七步:边界情况处理

  • 空数组或单元素数组:直接返回
  • 双元素数组:需要确保nums[0] <= nums[1]

第八步:复杂度分析

  • 排序交换法:时间复杂度O(nlogn),空间复杂度O(1)或O(n)(取决于排序算法)
  • 一次遍历法:时间复杂度O(n),空间复杂度O(1)

这种排序在信号处理、图形学中有实际应用,特别是在需要交替峰值和谷值的可视化场景中。

排序算法之:波浪排序(Wave Sort) 题目描述: 给定一个未排序的整数数组,你需要将其重新排列成"波浪形"排序。波浪排序要求数组元素交替排列,使得每个奇数索引(1, 3, 5...)的元素都大于或等于其相邻的两个元素,或者每个偶数索引(0, 2, 4...)的元素都小于或等于其相邻的两个元素。更具体地说,通常要求满足:nums[ 0] <= nums[ 1] >= nums[ 2] <= nums[ 3] >= nums[ 4 ]... 解题过程: 第一步:理解波浪排序的核心要求 波浪排序的核心模式是"小-大-小-大"交替排列。对于索引i: 如果i是偶数,那么nums[ i] <= nums[ i+1 ](当i+1存在时) 如果i是奇数,那么nums[ i] >= nums[ i+1 ](当i+1存在时) 第二步:分析问题特点 这个排序不需要完全有序,只需要满足局部的大小关系。我们可以利用这个特点设计更高效的算法。 第三步:选择解题策略 有两种主要方法: 排序后交换法:先排序再调整 一次遍历法:直接通过一次遍历调整位置 第四步:详细讲解排序后交换法 首先对数组进行升序排序 从索引1开始,每隔一个元素与后一个元素交换 具体操作:遍历所有奇数索引位置(1, 3, 5...),将当前元素与后一个元素交换 示例:数组[ 3, 2, 1, 4 ] 排序后:[ 1, 2, 3, 4 ] 交换索引1和2:得到[ 1, 3, 2, 4 ] 验证:1<=3>=2 <=4 ✓ 第五步:详细讲解一次遍历法(更优解) 这种方法不需要完全排序,时间复杂度O(n): 遍历数组的所有偶数索引位置(0, 2, 4...) 对于每个位置i,检查三个条件: 如果i>0且nums[ i] > nums[ i-1],交换nums[ i]和nums[ i-1 ] 如果i<n-1且nums[ i] > nums[ i+1],交换nums[ i]和nums[ i+1 ] 实际上只需要保证每个偶数位置的值都不大于相邻位置即可 第六步:算法正确性证明 通过数学归纳法可以证明,这种方法能保证: 所有偶数位置的值都不大于相邻的奇数位置值 所有奇数位置的值都不小于相邻的偶数位置值 第七步:边界情况处理 空数组或单元素数组:直接返回 双元素数组:需要确保nums[ 0] <= nums[ 1 ] 第八步:复杂度分析 排序交换法:时间复杂度O(nlogn),空间复杂度O(1)或O(n)(取决于排序算法) 一次遍历法:时间复杂度O(n),空间复杂度O(1) 这种排序在信号处理、图形学中有实际应用,特别是在需要交替峰值和谷值的可视化场景中。