Как я могу отсортировать массив двойных указателей на основе значений, на которые они указывают?

Я пытаюсь создать функцию на C / C++ для сортировки массива и замены каждого значения его «оценкой» или рангом. Он принимает массив двойных указателей на массив целых чисел и сортирует двойные указатели на основе разыменованного значения целых чисел. Я несколько раз пытался заставить его работать, но не могу этого сделать. Еще раз, он должен отсортировать двойные указатели на основе значений, на которые они указывают. Вот что у меня есть:

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];
            pArray[j+1] = &temp;
            flag = 1;                     // indicates that a swap occurred.
        }
    }
  }
}

См. Также stackoverflow.com/questions/5632832/…, в котором я привожу два примера. Использование O (log (n)), а не O (N ^ 2)

elcuco 01.01.2013 13:56
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
3 092
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Вы близки. Вы ссылаетесь на адрес элементов массива при замене местами, в чем нет необходимости. Элементы в массиве - это указатели, и их нужно поменять местами.

Смотри ниже:

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 = ArrayLength - 1; i > 0 && flag; i--)
    {
        flag = 0;
        for (j = 0; j < i; j++)
        {
            if (*pArray[j] > *pArray[j+1])      // ascending order simply changes to <
            { 
                temp = pArray[j];             // swap elements
                pArray[j] = pArray[j+1];
                pArray[j+1] = temp;
                flag = 1;               // indicates that a swap occurred.
            }
        }
    }
}

Также проверьте это прекрасное сообщение в блоге о пузырьковой сортировке, если вам интересно (извините, бессовестная вилка :)). Надеюсь, что это поможет вам с домашним заданием;)


Обновлено: обратите внимание на тонкую «оптимизацию», когда вы отсчитываете от длины массива и увеличиваете только до 'i' во внутреннем цикле. Это избавит вас от ненужного повторного анализа уже отсортированных элементов.

Heh, this isnt homework.

В таком случае рассмотрите возможность использования STL для управления массивами и сортировки. Его проще разрабатывать и поддерживать, а алгоритм std :: sort асимптотически быстрее, чем пузырьковая сортировка.

Вам следует подумать об использовании std::swap() для подкачки. Если да, назовите это так:

swap( obj1, obj2 );

скорее, чем:

std::swap( obj1, obj2 );

Поскольку первая вызывающая семантика позволит правильному поиску пространства имен найти правильную перегрузку, если таковая существует. Обязательно наличие:

using namespace std;

или же:

using std::swap;

где-то.

Hmm, I don't have much experience with the STL. Could you give an example?

Эта программа создает вектор целых чисел, сортирует его и отображает результаты.

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

int main()
{
    vector<int>; vec;
    vec.push_back(7);
    vec.push_back(5);
    vec.push_back(13);
    sort(vec.begin(), vec.end());

    for (vector<int>::size_type i = 0; i < vec.size(); ++i)
    {
        cout << vec[i] << endl;
    }
}

Завершая пост Брайана Энсинка, вы найдете STL, полный сюрпризов. Например, алгоритм std :: sort:

#include <iostream>
#include <vector>
#include <algorithm>

void printArray(const std::vector<int *> & p_aInt)
{
   for(std::vector<int *>::size_type i = 0, iMax = p_aInt.size(); i < iMax; ++i)
   {
      std::cout << "i[" << static_cast<int>(i) << "] = " << reinterpret_cast<unsigned     int>(p_aInt[i]) << std::endl ;
   }

   std::cout << std::endl ;
}


int main(int argc, char **argv)
{
   int a = 1 ;
   int b = 2 ;
   int c = 3 ;
   int d = 4 ;
   int e = 5 ;

   std::vector<int *> aInt ;

   // We fill the vector with variables in an unordered way
   aInt.push_back(&c) ;
   aInt.push_back(&b) ;
   aInt.push_back(&e) ;
   aInt.push_back(&d) ;
   aInt.push_back(&a) ;

   printArray(aInt) ; // We see the addresses are NOT ordered
   std::sort(aInt.begin(), aInt.end()) ; // DO THE SORTING
   printArray(aInt) ; // We see the addresses are ORDERED

   return EXIT_SUCCESS;
}

Первая печать массива покажет неупорядоченные адреса. Второй, после сортировки, покажет упорядоченные адреса. В моем компиляторе у нас есть:

i[0] = 3216087168
i[1] = 3216087172
i[2] = 3216087160
i[3] = 3216087164
i[4] = 3216087176

i[0] = 3216087160
i[1] = 3216087164
i[2] = 3216087168
i[3] = 3216087172
i[4] = 3216087176

Дайте STL Заголовок взгляд http://www.cplusplus.com/reference/algorithm/ Вы найдете множество утилит. Обратите внимание, что у вас есть другая реализация контейнеров, которая может вам больше подойти (std :: list? Std :: map?).

На самом деле он хочет отсортировать указанное значение. Вам нужно добавить лямбду к сортировке, чтобы разыменовать указатели, вместо сортировки указателей. Проверьте исходный пост.

ceorron 20.09.2020 23:55

Другие вопросы по теме