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

PIRLO

11:39, 29th August, 2020

Теги

c++   c   arrays   pointers   reference    

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

Просмотров: 408   Ответов: 5

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

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.
        }
    }
  }
}



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

ЯЯ__4

11:35, 15th August, 2020

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

Увидеть ниже:

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.
            }
        }
    }
}

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


Edit: обратите внимание на тонкий "optimisation", где вы отсчитываете назад от длины массива и только увеличиваете до 'i' во внутреннем цикле. Это избавит вас от ненужного повторного разбора элементов, которые уже были отсортированы.


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

PAGE

12:15, 4th August, 2020

Хех, это не домашнее задание.

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


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

PROGA

19:51, 18th August, 2020

Вы должны рассмотреть возможность использования std::swap() для выполнения обмена. Если да, то назовите его таковым:

swap( obj1, obj2 );

вместо того чтобы:

std::swap( obj1, obj2 );

Как первый вызов semantic позволит правильному поиску пространства имен найти правильную перегрузку, если она существует. Будьте уверены, что у вас есть либо:

using namespace std;

или:

using std::swap;

где-то.


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

dumai

04:33, 14th August, 2020

Хм, у меня нет большого опыта работы с STL. Не могли бы вы привести пример?

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

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


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

dump

16:05, 3rd August, 2020

Чтобы завершить сообщение Брайана Энсинка, вы найдете 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 <algorithm> посмотреть http://www.cplusplus.com/reference/algorithm/ вы найдете много утилит. Обратите внимание, что у вас есть другая реализация контейнеров, которая может подойти вам лучше (std::list? std::map?).


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

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