📜  将数组转换为之字形时尚的 C++ 程序

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

将数组转换为之字形时尚的 C++ 程序

给定一个DISTINCT元素数组,在 O(n) 时间内以之字形方式重新排列数组的元素。转换后的数组的格式应为a < b > c < d > e < f

示例

一个简单的解决方案是首先对数组进行排序。排序后,排除第一个元素,成对交换剩余元素。 (即保持 arr[0] 不变,交换 arr[1] 和 arr[2],交换 arr[3] 和 arr[4],等等)。
时间复杂度:O(N log N),因为我们需要先对数组进行排序。

我们可以使用有效的方法O(n)时间内进行转换。这个想法是使用经过修改的冒泡排序的一次。

  • 维护一个标志来表示我们当前需要的顺序(即 < 或 >)。
  • 如果当前的两个元素不是该顺序,则交换这些元素,否则不交换。

让我们看看使用三个连续元素 A、B、C 的主要逻辑。

假设我们当前正在处理 B 和 C,并且当前关系是'C。由于当前关系是'',即 A 必须大于 B。所以,关系是 A > B 和 B > C。我们可以推导出 A > C . 所以如果我们交换 B 和 C 那么关系是 A > C 和 C < B. 最后我们得到期望的顺序ACB
请参阅此以获取更多说明。

下图是上述方法的试运行:

以下是上述方法的实现:

C++
// C++ program to sort an array in 
// Zig-Zag form 
#include  
using namespace std; 
  
// Program for zig-zag conversion 
// of array 
void zigZag(int arr[], int n) 
{ 
    // Flag true indicates relation "<" 
    // is expected, else ">" is expected. 
    // The first expected relation is "<" 
    bool flag = true; 
  
    for (int i = 0; i <= n - 2; i++) 
    { 
        /* "<" relation expected */
        if (flag) 
        { 
            /* If we have a situation like 
               A > B > C, we get A > B < C 
               by swapping B and C */
            if (arr[i] > arr[i+1]) 
                swap(arr[i], arr[i+1]); 
        } 
  
        /* ">" relation expected */
        else 
        { 
            /* If we have a situation like 
               A < B < C, we get A < C > B 
               by swapping B and C */
            if (arr[i] < arr[i+1]) 
                swap(arr[i], arr[i+1]); 
        } 
  
        // flip flag 
        flag = !flag; 
    } 
} 
  
// Driver code
int main() 
{ 
    int arr[] = {4, 3, 7, 8, 6, 2, 1}; 
    int n = sizeof(arr) / sizeof(arr[0]); 
    zigZag(arr, n); 
    for (int i = 0; i < n; i++) 
        cout << arr[i] << " "; 
    return 0; 
}


输出:

3  7  4  8  2  6  1 

时间复杂度: O(n)
辅助空间: O(1)

有关详细信息,请参阅有关将数组转换为 Zig-Zag 时尚的完整文章!