Как отсортировать массив в C ++ определенным образом

0

Я хочу каким-то образом отсортировать массив, чтобы он выглядел так: a [0]> = a [1] <= a [2]> = a [3] <= a [4] Я не знаю с чего начать. Любое предложение будет оценено!

Теги:
arrays
sorting

5 ответов

1
Лучший ответ

Здесь код, очевидно, вы можете изменить длину и номера массива в соответствии с вашими спецификациями.

#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;
}
  • 0
    Незначительное улучшение: вам не нужен амперсанд и индексирование при инициализации переменной- pointer - массивы распадаются на указатели, так что pointer=array является совершенно допустимым и означает в точности то же самое, что pointer=&array[0] . По той же самой причине вам на самом деле не нужна переменная pointer - вы можете просто передать массив функции, ожидающей указатель: special_Sort(array, 10) .
  • 0
    Большая проблема: что будет делать ваш код, если array будет на один элемент короче (9 элементов вместо 10) ...?
2

Сортировка всего массива (выберите любой алгоритм сортировки, который вы хотите). Затем возьмите каждую пару с начала и замените элементы в паре

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

1

Я предполагаю здесь, что отношения являются инклюзивными (в том смысле, что они продолжаются до конца строки - 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]
0

Если вы только сортируете его так, чтобы значения возрастали и падали произвольно, вы можете достичь этого, проверив значения в вашем массиве и обменивая элементы, если они не удовлетворяют ограничениям вашего типа.

На данный момент у меня нет компилятора, и вам придется реализовать своп, но что-то вроде этого может работать:

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];
     }
    }
  }

Я не согласен с другими ответами, размещенными здесь, поэтому вам нужно будет найти то, что вам нужно, в зависимости от отношения четных и нечетных индексированных элементов.

0

Сделанные шаги:
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;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню