Я хочу каким-то образом отсортировать массив, чтобы он выглядел так: a [0]> = a [1] <= a [2]> = a [3] <= a [4] Я не знаю с чего начать. Любое предложение будет оценено!
Здесь код, очевидно, вы можете изменить длину и номера массива в соответствии с вашими спецификациями.
#include <iostream>
#include <algorithm>
using namespace std;
void special_Sort(int *array, int size){
//doesn't return a value, changes the values inside the array
int temp;
//for swapping purposes
sort(array, array+size);
//sorts the array in ascending order
for(int i=0; i<size; i=i+2){
temp=array[i];
array[i]=array[i+1];
array[i+1]=temp;
}
//array is now sorted
}
int main(){
// array declaration, call the function, etc...
int array[10]={2,4,1,5,6,3,7,9,8,10};
int *pointer;
pointer=&array[0];
special_Sort(pointer, 10);
// if you want to print the result
// for(int i =0; i<10; i++)
// cout<<array[i]<<" ";
return 0;
}
Сортировка всего массива (выберите любой алгоритм сортировки, который вы хотите). Затем возьмите каждую пару с начала и замените элементы в паре
2,4,1,5,6,3,7,9,8,10
Отсортировано по: 1,2,3,4,5,6,7,8,9,10
Пара и своп: (2,1),(4,3),(6,5),(8,7),(10,9)
результат: 2,1,4,3,6,5,8,7,10,9
Я предполагаю здесь, что отношения являются инклюзивными (в том смысле, что они продолжаются до конца строки - a [0]> = max (a [1], a [2],...) и a [ 1] <= min (a [2], a [3],...) и т.д.). В противном случае это не определяется однозначно, так как {5,4,3,2,1} можно отсортировать, например, в {5,1,4,3,2} или {3,2,5,1,4}.
Итак, если предположить, что это так, его легко решить путем сортировки всего массива в порядке убывания, а затем просто чередовать их -
a[0], a[n-1], a[1], a[n-2], ...
и так далее. Просто цикл с двумя индексами, один начиная с начала и один с конца, или используйте что-то вроде этого -
for (i=0; i<n/2; i++) {
result[i*2] = sorted[i];
result[i*2+1] = sorted[n-i];
}
if (n%2)
result[n-1] = sorted[n/2]
Если вы только сортируете его так, чтобы значения возрастали и падали произвольно, вы можете достичь этого, проверив значения в вашем массиве и обменивая элементы, если они не удовлетворяют ограничениям вашего типа.
На данный момент у меня нет компилятора, и вам придется реализовать своп, но что-то вроде этого может работать:
for(i=0; i < a.length(); i++){
//If index is even
if(i%2 == 0){
if(a[i] < a[i+1]){
swap(a[i], a[i+1]);
}
} else { ///If index is odd
if(a[i]>a[i+1]){
swap(a[i], a[i+1];
}
}
}
Я не согласен с другими ответами, размещенными здесь, поэтому вам нужно будет найти то, что вам нужно, в зависимости от отношения четных и нечетных индексированных элементов.
Сделанные шаги:
1) генерирует некоторый случайный массив
2) сортировать массив
3) элементы переключателя при необходимости с альтернативными <=,> = сравнениями
Вот код, который делает это: (не учитывайте случайный генератор, его просто простой способ генерации массива)
#define sizeArr 50
int main(void)
{
int array[sizeArr];
int i, temp;
for(i=0;i<sizeArr;i++)
{
array[i]=randomGenerator(1, 1000);
Sleep(2);//force clock tick for new srand() to be effective in rand() generator
}
//sort array
qsort(array, sizeArr, sizeof(int), cmpfunc);
//pick the first non repeat 90th percent and print
for(i=0;i<sizeArr-1;i++)
{
if(i%2==0)//alternate between >= && <=
{
if(array[i+1] >= array[i])
{
temp = array[i+1];
array[i+1]=array[i];
array[i]=temp;
}
}
else
{
if(array[i+1] <= array[i])
{
temp = array[i+1];
array[i+1]=array[i];
array[i]=temp;
}
}
}
getchar();
return 0;
}
int cmpfunc (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
int randomGenerator(int min, int max)
{
int random=0, trying=0;
trying = 1;
srand(clock());
while(trying)
{
random = (rand()/32767.0)*(max+1);
(random >= min) ? (trying = 0) : (trying = 1);
}
return random;
}
pointer
- массивы распадаются на указатели, так чтоpointer=array
является совершенно допустимым и означает в точности то же самое, чтоpointer=&array[0]
. По той же самой причине вам на самом деле не нужна переменнаяpointer
- вы можете просто передать массив функции, ожидающей указатель:special_Sort(array, 10)
.array
будет на один элемент короче (9 элементов вместо 10) ...?