C++程序 将数组排成波浪形
给定一个无序的整数数组,将数组排成波浪形的形式。如果数组arr[0..n-1]排成如下形式,那么它就是波浪形数组: arr[0] >= arr[1] <= arr[2] >= arr[3] <= arr[4] >= ….
举例:
一种 简单的解决方法 是使用排序。首先对输入数组进行排序,然后交换所有相邻的元素。
例如,让输入数组为{3,6,5,10,7,20}。排序后,我们得到{3,5,6,7,10,20}。交换相邻的元素后,我们得到{5,3,7,6,20,10}。
以下是此简单方法的实现。
输出:
上述解决方案的时间复杂度为O(nLogn),如果使用类似于归并排序、堆排序等O(nLogn)的排序算法,则可以将其实现为O(n)时间的单次遍历算法。该算法的思想基于以下事实:如果我们确保所有偶数位置的元素(在索引0、2、4、..处)都大于其相邻的奇数元素,那么我们就不必担心奇数位置的元素。以下是简要步骤。
1)遍历输入数组的所有偶数位置,并执行以下操作。
….a)如果当前元素小于前面的奇数元素,请交换前面的元素和当前元素。
….b)如果当前元素小于后面的奇数元素,请交换后面的元素和当前元素。
以下是实现以上简单算法的代码。
输出:
时间复杂度:O(n),其中 n 是输入数组的大小。遍历数组中偶数元素的循环运行 n/2 次,每次迭代需要常数时间。
空间复杂度:O(1),因为该算法在原地对输入数组进行排序,而不使用任何依赖于输入大小的其他数据结构。唯一使用的额外空间是用于存储交换操作期间临时变量的常量空间量。