📜  Python程序以波形形式对数组进行排序

📅  最后修改于: 2022-05-13 01:54:41.056000             🧑  作者: Mango

Python程序以波形形式对数组进行排序

给定一个未排序的整数数组,将数组排序为波状数组。如果 arr[0] >= arr[1] <= arr[2] >= arr[3] <= arr[4] >= ... 则数组 'arr[0..n-1]' 以波形排序..

例子:

Input:  arr[] = {10, 5, 6, 3, 2, 20, 100, 80}
 Output: arr[] = {10, 5, 6, 2, 20, 3, 100, 80} OR
                 {20, 5, 10, 2, 80, 6, 100, 3} OR
                 any other array that is in wave form

 Input:  arr[] = {20, 10, 8, 6, 4, 2}
 Output: arr[] = {20, 8, 10, 4, 6, 2} OR
                 {10, 8, 20, 2, 6, 4} OR
                 any other array that is in wave form

 Input:  arr[] = {2, 4, 6, 8, 10, 20}
 Output: arr[] = {4, 2, 8, 6, 20, 10} OR
                 any other array that is in wave form

 Input:  arr[] = {3, 6, 5, 10, 7, 20}
 Output: arr[] = {6, 3, 10, 5, 20, 7} OR
                 any other array that is in wave form
 

一个简单的解决方案是使用排序。首先对输入数组进行排序,然后交换所有相邻元素。
例如,让输入数组为 {3, 6, 5, 10, 7, 20}。排序后,我们得到 {3, 5, 6, 7, 10, 20}。交换相邻元素后,我们得到 {5, 3, 7, 6, 20, 10}。

下面是这种简单方法的实现。

Python
# Python function to sort the array arr[0..n-1] in wave form,
# i.e., arr[0] >= arr[1] <= arr[2] >= arr[3] <= arr[4] >= arr[5]
def sortInWave(arr, n):
      
    #sort the array
    arr.sort()
     
    # Swap adjacent elements
    for i in range(0,n-1,2):
        arr[i], arr[i+1] = arr[i+1], arr[i]
  
# Driver program
arr = [10, 90, 49, 2, 1, 5, 23]
sortInWave(arr, len(arr))
for i in range(0,len(arr)):
    print arr[i],
      
# This code is contributed by __Devesh Agrawal__


Python
# Python function to sort the array arr[0..n-1] in wave form,
# i.e., arr[0] >= arr[1] <= arr[2] >= arr[3] <= arr[4] >= arr[5]
def sortInWave(arr, n):
      
    # Traverse all even elements
    for i in range(0, n, 2):
          
        # If current even element is smaller than previous
        if (i> 0 and arr[i] < arr[i-1]):
            arr[i],arr[i-1] = arr[i-1],arr[i]
          
        # If current even element is smaller than next
        if (i < n-1 and arr[i] < arr[i+1]):
            arr[i],arr[i+1] = arr[i+1],arr[i]
  
# Driver program
arr = [10, 90, 49, 2, 1, 5, 23]
sortInWave(arr, len(arr))
for i in range(0,len(arr)):
    print arr[i],
      
# This code is contributed by __Devesh Agrawal__


输出:

2 1 10 5 49 23 90

如果使用 O(nLogn) 排序算法(如合并排序、堆排序等),则上述解决方案的时间复杂度为 O(nLogn)。
这可以通过对给定数组进行一次遍历在 O(n) 时间内完成。这个想法是基于这样一个事实,即如果我们确保所有偶数定位(在索引 0、2、4 ……)的元素都大于它们相邻的奇数元素,我们就不需要担心奇数定位元素。以下是简单的步骤。
1)遍历输入数组的所有偶数定位元素,并执行以下操作。
....a) 如果当前元素小于前一个奇数元素,则交换前一个元素和当前元素。
....b)如果当前元素小于下一个奇数元素,则交换下一个和当前元素。

以下是上述简单算法的实现。

Python

# Python function to sort the array arr[0..n-1] in wave form,
# i.e., arr[0] >= arr[1] <= arr[2] >= arr[3] <= arr[4] >= arr[5]
def sortInWave(arr, n):
      
    # Traverse all even elements
    for i in range(0, n, 2):
          
        # If current even element is smaller than previous
        if (i> 0 and arr[i] < arr[i-1]):
            arr[i],arr[i-1] = arr[i-1],arr[i]
          
        # If current even element is smaller than next
        if (i < n-1 and arr[i] < arr[i+1]):
            arr[i],arr[i+1] = arr[i+1],arr[i]
  
# Driver program
arr = [10, 90, 49, 2, 1, 5, 23]
sortInWave(arr, len(arr))
for i in range(0,len(arr)):
    print arr[i],
      
# This code is contributed by __Devesh Agrawal__

输出:

90 10 49 1 5 2 23
 

请参阅完整的文章以波形排序数组以获取更多详细信息!