Моя программа задана точками сортировки на плоскости x-y, заданной пользователем, в соответствии с их расстоянием от начала координат с использованием сортировки ковша. В случае наличия двух точек с одинаковым расстоянием в качестве первой точки будет выбрана точка с наименьшей координатой x. Если и расстояние, и координата x одинаковы, первым будет элемент с наименьшей координатой y. Вывод - это сами точки, а не их расстояния. Наиболее логичным способом, который я нашел для этого до сих пор, является создание пользовательской структуры данных, в которой хранятся как координата x, так и координата y, и ее расстояние в одном элементе. Проблема, которую я сейчас имею в виду, это мой текущий алгоритм для стандартных векторов двойников, и я не знаю, как преобразовать сортировку в соответствии с моими потребностями. Любые идеи или предложения были бы полезными.Ведро Сортировка с пользовательской структурой данных
Вот макет структуры:
struct point {
double xc;
double yc;
double dist; };
Текущее ведро сортировка, который отлично работает с векторами двойников.
void bucketSort(vector<double> &arr) {
int n = B.size();
vector<point> b[n];
for (int i=0; i<n; i++)
{
int bi = n*arr[i];
b[bi].push_back(arr[i]);
}
for (int i=0; i<n; i++)
sort(b[i].begin(), b[i].end());
int index = 0;
for (int i = 0; i < n; i++){
for (int j = 0; j < b[i].size(); j++){
arr[index++] = b[i][j]; }
}
}
Полный код, на данный момент.
using namespace std;
struct point {
double xc;
double yc;
double dist;
};
vector<double> A;
vector<double> B;
double findDistance(double x = 0, double y = 0) {
double x2 = pow(x, 2);
double y2 = pow(y, 2);
double z = x2 + y2;
double final = sqrt(z);
return final;
}
void bucketSort(vector<double> &arr)
{
int n = B.size();
vector<point> b[n];
for (int i=0; i<n; i++)
{
int bi = n*arr[i];
b[bi].push_back(arr[i]);
}
for (int i=0; i<n; i++)
sort(b[i].begin(), b[i].end());
int index = 0;
for (int i = 0; i < n; i++){
for (int j = 0; j < b[i].size(); j++){
arr[index++] = b[i][j]; }
}
}
int main(){
double number; int t = 0;
while (cin >> number){
A.push_back(number); }
struct point C[A.size()];
while (t < A.size()){
C[t/2].xc = A[t]; C[t/2].yc = A[t + 1];
C[t/2].dist = (findDistance(A[t], A[t + 1])); t += 2; }
cout << setprecision(6); cout << fixed; ;
bucketSort(C);
cout << showpos; cout << fixed;
int x = 0;
while (x < (A.size()/2)){
cout << C[x].xc << " " << C[x].yc << endl;
x++;
}
}
вектор двойников B здесь потому, что на начальном этапе, я пытался сделать это с несколькими векторами двойников.
Вот образец ввода:
0.2 0.38
0.6516 -0.1
-0.3 0.41
-0.38 0.2
Пример вывода:
-0.380000 +0.200000
+0.200000 +0.380000
-0.300000 +0.410000
+0.651600 -0.100000
Я понимаю, что точка может иметь гораздо больше функций, добавленных к нему, чтобы сделать его более удобным для использования в целом, но я стремлюсь к тому, чтобы получить текущую работу. Любые предложения или помощь будут очень признательны. Пожалуйста и спасибо.
Да, мой плохой. Добавлены теги. –