Алфавитный (сортирующий) вектор указателей - PullRequest
1 голос
/ 26 мая 2011

У меня есть вектор указателей, которые указывают на набор критических объектов.У каждого критика есть такие атрибуты, как идентификатор пользователя, имя, фамилия и т. Д.

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

void quickSortCritics(vector<Critic*> & v, int from, int to)
{
  if (from < to) 
  {
    int middle = partition(v, from, to);
    quickSortCritics(v, from, middle - 1);
    quickSortCritics(v, middle + 1, from);
  }
}

int partition(vector<Critic*> & v, int from, int to)
{
  char pivot = (v[from]->getFirstName())[0];
  int left_index = from - 1;
  int right_index = to + 1;

  do
  {
    do
    {
      right_index--;
    } while ( (v[right_index]->getFirstName())[0] > pivot);
    do
    {
      left_index++;
    } while ( (v[left_index]->getFirstName())[0] < pivot);

    if (left_index < right_index)
    {
      cout << "swapping " << v[left_index]->getFirstName() << " with " << v[right_index]->getFirstName() << endl;
      swap(v[left_index], v[right_index]);
    }
  } while ( left_index < right_index );

  return right_index;
}

Есть предложения?

Ответы [ 2 ]

7 голосов
/ 26 мая 2011

Если это не домашнее задание, то почему бы вам не использовать std::sort, предоставив компаратор в качестве третьего аргумента?

bool compare_func(const Critic* c1,const Critic* c2) { /***implement it***/ }

vector<Critic*> v;
//...

std::sort(v.begin(), v.end(), compare_func);
0 голосов
/ 26 мая 2011

Если вы все еще хотите использовать свою собственную быструю сортировку, это будет выглядеть так.Я предполагаю, что вы используете std :: string.

void quickSortCritics(vector<Critic*>& v, int top, int bottom){

  if(top < bottom){
    int middle = partition(v, top, bottom);
    quickSortCritics(v, top, middle);  // sort top partition
    quickSortCritics(v, middle + 1, bottom);  //sort bottom partition
  }
}

int partition(vector<Critic*>& v, int top, int bottom){

  std::string pivot = v[top]->getFirstName();
  int left_index = top - 1;
  int right_index = bottom + 1;
  string tmp;

  do{
    do{
      right_index--;
    }while( pivot.compare(v[right_index]->getFirstName()) < 0 );

    do{
      left_index++;
    }while( pivot.compare(v[left_index]->getFirstName()) > 0);

    if (left_index < right_index)
      swap(v[left_index], v[right_index]);

  }while( left_index < right_index );

  return right_index;
}

Тогда вы бы назвали это так:

quickSortCritics (your_vector, 0, your_vector.size () - 1);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...