在C ++中,偶数位置的正元素和奇数位置的负元素(不保持相对顺序)

在这个问题中,我们得到了一个数组,我们的任务是将数组转换为所有正数都位于偶数索引位置,所有负数都位于奇数索引位置。

正值和负值的数量可能不相等,在这种情况下,我们将不会移动多余的值。

让我们举个例子来了解这个问题,

输入-{3,5,-1,19,-7,-2}

输出-{3,-1,5,-7,19,-2}

为了解决这个问题,我们将不得不找到数组中乱序的元素。可以找到一种以上的方法,这里我们将讨论其中两种。

方法1

该方法将简单地遍历数组并找到不在该位置的元素的首次出现(即,正数不等于偶数,负数不等于奇数),然后交换它们。我们将执行此过程,直到遍历整个数组为止。

示例

显示我们解决方案实施情况的程序,

#include<iostream>
using namespace std;
void swapElements(int* a, int i , int j){
   int temp = a[i];
   a[i] = a[j];
   a[j] = temp;
   return ;
}
void printArray(int* a, int n){
   for(int i = 0; i<n; i++)
   cout<<a[i]<<"\t";
   cout<<endl;
   return ;
}
void generateOrderedArray(int arr[], int n){
   for(int i = 0; i <n; i++){
      if(arr[i] >= 0 && i % 2 == 1){
         for(int j = i + 1; j <n; j++){
            if(arr[j] < 0 && j % 2 == 0){
               swapElements(arr, i, j);
               break ;
            }
         }
      }
      else if(arr[i] < 0 && i % 2 == 0){
         for(int j = i + 1; j <n; j++){
            if(arr[j] >= 0 && j % 2 == 1){
               swapElements(arr, i, j);
               break;
            }
         }
      }
   }
   printArray(arr, n);
}
int main(){
   int arr[] = { 1, -3, 5, 6, -3, 6, 7, -4, 9, 10 };
   int n = sizeof(arr)/sizeof(arr[0]);
   cout<<"Inital Array is : ";
   printArray(arr, n);
   cout<<"偶数索引为正数而奇数索引为负数的数组:";
   generateOrderedArray(arr,n);
   return 0;
}

输出结果

Inital Array is : 3 5 -1 19 -7 -2
偶数索引为正数而奇数索引为负数的数组: 3 -1 5 -7 19 -2

方法二

在这种方法中,我们将使用看起来像一种快速技术的过程。在这里,我们将使用两个指针,一个指向正数,另一个指向负数。我们将在索引0(偶数索引)处设置正指针,在索引1(奇数索引)处设置负指针。然后将指针向前移动2。在正指针遇到负数而负指针遇到正数时停止。然后都停止时交换。如果任何指针超出数组索引,我们将停止执行。

示例

显示我们解决方案实施情况的程序

#include <iostream>
using namespace std;
void swapElements(int* a, int i , int j){
   int temp = a[i];
   a[i] = a[j];
   a[j] = temp;
   return ;
}
void printArray(int *a, int n){
   for (int i = 0; i <n; i++)
   cout<<a[i]<<"\t";
   cout<<endl;
}
void generateOrderedArray(int a[], int size){
   int positive = 0, negative = 1;
   while (1) {
      while (positive < size && a[positive] >= 0)
      positive += 2;
      while (negative <size && a[negative] <= 0)
      negative += 2;
      if (positive < size && negative < size)
         swapElements(a, positive, negative);
      else
         break;
   }
}
int main(){
   int arr[] = { 3, 5, -1, 19, -7, -2 };
   int n = (sizeof(arr) / sizeof(arr[0]));
   cout<<"Inital Array is : ";
   printArray(arr, n);
   cout<<"偶数索引为正数而奇数索引为负数的数组: ";
   generateOrderedArray(arr, n);
   printArray(arr, n);
   return 0;
}

输出结果

Inital Array is : 3 5 -1 19 -7 -2
偶数索引为正数而奇数索引为负数的数组: 3 -1 5 -7 19 -2