Member 14771149 Ответов: 3

C++ функция для изменения порядка элементов в массиве.


я хочу создать функцию, которая сначала переупорядочивает четные элементы, а затем нечетные.
это то, что я пробовал и хочу знать, в чем проблема?
выход-это >>
новый массив:-3368601935748

Что я уже пробовал:

#include <iostream>
using namespace std;
void Even(int* arr, int n) {
	int k;
	for (int i = 0; i < n; i++) {
		if (arr[i] % 2 != 0) {
			k = arr[i];
			arr[i] = arr[n-i];
			arr[n - i] = k;
		}
	}

	
}



int main() {
	int n;
	cout << "Enter number of elements:";
	cin >> n;
	int* a = new int[n];
	cout << "Enter the of elements:";
	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}
	Even(a, n);
	cout << "the new array is:";
	for (int i = 0; i < n; i++) {
		cout << a[i];
	}
	delete[]a;
}

3 Ответов

Рейтинг:
2

Greg Utas

Очевидно, что ваша стратегия обмена должна быть неправильной. Предположим, что первый и последний элементы нечетны. Ваш код попытается поменять их местами, а затем перейти ко второму элементу, оставив нечетный элемент в первой позиции. Но заметьте, что с i=0, вы будете пытаться поменять местами arr[0] с arr[n-0] Этот второй элемент также находится за концом массива!

Подумайте о передней половине массива, а не о задней половине, и посмотрите, что вы придумаете.

РЕДАКТИРОВАТЬ: Мой комментарий о двух половинах массива предполагает, что четные числа должны только предшествовать нечетным числам, а не то, что каждый набор чисел (четный и нечетный) должен быть отсортирован сам по себе.


CPallini

5.

Рейтинг:
2

CPallini

Еще одно решение...

#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
  int a[] = { 51, 27, -3, 1234, 71, -8, 42 -19, -999, 42 };

  auto itee = partition(begin(a), end(a), [](int a){ return (a&1)==0;});

  std::sort(begin(a), itee);
  std::sort(itee, end(a));

  for(auto x : a)
    cout << x <<  ' ';
  cout << std::endl;
}


Рейтинг:
0

k5054

Если у вас есть задание написать такую функцию, или если вы заинтересованы в написании функции сортировки для ваших собственных интересов, то вы должны следовать совету Грега и попытаться разработать свое собственное решение. Однако если вам просто нужно выполнить сортировку, то вам, вероятно, следует использовать средства, которые предоставляет вам C++. Есть sort алгоритм в STL, который можно использовать для сортировки массива для вас, вам просто нужно написать подходящую функцию, которая вернет true, если ее первый аргумент следует считать "меньше" первого элемента.

Теперь мы знаем, что можем определить, является ли число четным или нечетным, применяя mod 2, если ответ 0, то число четное, а 1-нечетное. Поскольку мы хотим отсортировать четные числа перед нечетными, если мы перевернем знак четных чисел, то четные числа будут отрицательными, поэтому они будут сортироваться как меньшие, чем нечетные числа. Есть еще одна последняя проблема, и это если оба числа, переданные в нашу функцию, четны, то нам нужно убедиться, что мы изменим наше сравнение так, чтобы, например, 2 сортировалось как меньше 4.

Сложив все это вместе, мы получим вот что:

#include <iostream>
#include <algorithm>

bool odd_even_sort(int i, int j)
{
    i *= (i%2) ? 1 : -1; // if i is even, flip the sign
    j *= (j%2) ? 1 : -1; // ditto for j

    if(i <= 0 && j <= 0) // if i and j are both even, reverse comparison 
        return i > j;    // so e.g. -2 sorts as "less" than -4
    
    return i < j;
}

// example of use:
int main()
{
    int ints[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

    // call std::sort() to re-arrange the array
    std::sort(ints, ints+10, odd_even_sort);  

    // display array:
    for(int i = 0; i <10; ++i)
        std::cout << ' ' << ints[i];
    std:: cout << std::endl;

    return 0;
}

output is :  2 4 6 8 10 1 3 5 7 9


CPallini

5.