Сведения о вопросе

LARVION

22:58, 9th August, 2020

Теги

c++   c   arrays   sorting    

Как ранжировать массив (Сортировать) по значению? *With в twist*

Просмотров: 416   Ответов: 1

Я хотел бы отсортировать массив в порядке возрастания, используя C/C++ . Результатом является массив, содержащий индексы элементов. Каждый индекс соответствует расположению элемента в отсортированном массиве.

Пример

Input:  1, 3, 4, 9, 6
Output: 1, 2, 3, 5, 4

Edit: я использую процедуру сортировки shell. Индексы повторяющихся значений выбираются произвольно, исходя из того, какие повторяющиеся значения являются первыми в исходном массиве.

Обновление:

Несмотря на все мои усилия, я не смог реализовать алгоритм сортировки для массива указателей. Текущий пример не будет компилироваться.

Может, кто-нибудь объяснит мне, что случилось?

Я был бы очень признателен за помощь!

void SortArray(int ** pArray, int ArrayLength) 
{
    int i, j, flag = 1;    // set flag to 1 to begin initial pass
    int * temp;    // holding variable orig with no *

    for (i = 1; (i <= ArrayLength) && flag; i++)
    {
        flag = 0;
        for (j = 0; j < (ArrayLength - 1); j++)
        {
            if (*pArray[j + 1] > *pArray[j])    // ascending order simply changes to <
            { 
                &temp = &pArray[j];    // swap elements
                &pArray[j] = &pArray[j + 1];    //the problem lies somewhere in here
                &pArray[j + 1] = &temp;
                flag = 1;    // indicates that a swap occurred.
            }
        }
    }
};


  Сведения об ответе

lourence

21:06, 1st October, 2020

Поскольку вы используете C++, я бы сделал это примерно так. Функция SortIntPointers может быть любым алгоритмом сортировки, важная часть заключается в том, что она сортирует массив указателей на основе int , на который они указывают. Как только это будет сделано, вы можете пройти через массив указателей и назначить их сортированный индекс, который в конечном итоге окажется в исходном положении в исходном массиве.

int* intArray; // set somewhere else
int arrayLen;  // set somewhere else  

int** pintArray = new int*[arrayLen];
for(int i = 0; i < arrayLen; ++i)
{
    pintArray[i] = &intArray[i];
}

// This function sorts the pointers according to the values they
// point to. In effect, it sorts intArray without losing the positional
// information.
SortIntPointers(pintArray, arrayLen);

// Dereference the pointers and assign their sorted position.
for(int i = 0; i < arrayLen; ++i)
{
    *pintArray[i] = i;
}

Надеюсь, это достаточно ясно.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться