Сортировка вставок в классе? - PullRequest
0 голосов
/ 28 ноября 2018

Я новичок в Cpp, и у меня есть вопрос, на который я не могу найти ответ.Поэтому я пишу эту программу о туристических достопримечательностях, используя класс.Внутри у меня есть название достопримечательности, адреса и расстояние от центра города.Все, что я сделал, это ввод и вывод.Теперь я понятия не имею, как сортировать их с InsertionSort.Нужен ли мне еще один массив?Я хочу отсортировать их по расстоянию, но не знаю, как это написать.

Вот что у меня есть

#include <iostream>
#include <string>
using namespace std;
class Tobekt {
  private: string name;
          string addres;
          int distance;


  public:
    void input(void);
    void output(void);
}; 

void Tobekt::input(){

   cout<<"Landmark name: ";
   getline(cin, name);
   getline(cin, addres);
   cout<<"Addres: "; 
    getline(cin, addres);
    cout<<"Distance from the city center:  ";
    cin>>distance;
}
void Tobekt::output(){
    cout<<endl;
    cout<<"Landmark name: "<<name<<endl;
   cout<<"Addres: "<<addres<<endl; 
    cout<<"Distance from the city center: "<<distance<<endl;

}

int main()
    { 
    int n;
    cout<<"Tourist landmarks:" ;
    cin>>n;
    Tobekt *A = new Tobekt[n];
    for(int i=0; i<n; i++)
    {
        A[i].input();
    }
    for(int i=0; i<n; i++)
    {
        A[i].output();
    }

return 0;
    }

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

Сортировка вставкой Алгоритм не требует нового массива для сортировки.Идея, лежащая в основе сортировки вставкой, состоит в том, чтобы дважды проходить по массиву.

  • Первый цикл состоит в том, чтобы проходить по «несортированным» элементам в массиве и выбирать первый «несортированный» элемент.
  • Второй цикл заключается в сравнении этого элемента с предыдущими «отсортированными» элементами - если он «меньше», переместите элемент в направлении начала индекса массива и повторяйте его, пока он не будет перемещен.

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

bool SmallerDistance(const Tobekt& lhs, const Tobekt& rhs)
{
    return lhs.GetDistance() < rhs.GetDistance();
}

Конечно, вам нужно создать функцию получения, чтобы получить расстояние от класса.Кроме того, вы всегда можете создать функцию-член operator< и сравнить ее с двумя переменными.

PS Не забудьте удалить переменную после new, иначе у вас будет утечка памяти для вашей программы.

0 голосов
/ 28 ноября 2018

Вы можете найти книгу R.Lafore "Алгоритмы и структуры данных в Java" полезно.Есть две главы об алгоритмах сортировки, включая сортировку вставкой с соответствующими фрагментами кода.(Это говорит о Java, но синтаксис в Java близок к C ++, и в книге есть раздел, в котором обсуждаются различия между двумя языками.)

0 голосов
/ 28 ноября 2018

Вы можете просто отсортировать массив с помощью алгоритма sort, который имеется в стандартной библиотеке, и предоставить собственные критерии сортировки.В следующем, например, достопримечательности отсортированы по расстоянию.

auto sort_criteria=[](const auto& a, const auto&b){
return a.distance < b.distance;
};

int main()
    { 
      Tobekt *A = new Tobekt[n];
      //read input
       sort(A, A+n, sort_criteria);
      //other stuff
    }
...