同时对两个矢量进行排序
Sorting two vectors at once?
我当前的项目涉及根据点与x-y坐标平面原点的距离对点进行排序。它必须找到每个点与原点的距离,对距离进行排序,并输出创建距离的点,而不是距离。它只能使用bucketsort和vectors。我的排序很好,但我很难弄清楚如何确保距离向量和点向量保持对齐。(距离aB[0]是从c[0]处的点创建的,即使该点最初不在c[0]处。)这是我迄今为止的代码。
标准用户输入,例如:
0.2 0.38
0.6516 -0.1
-0.3 0.41
-0.38 0.2
首先,主要是从用户那里获得输入。点的每一半最初作为其自身的二重进入向量A,然后与另一半组合为向量C中的一对。
int main(){
double number; int t = 0; pair<double,double> x;
while (cin >> number){
A.push_back(number); }
while (t < A.size()){
x = make_pair(A[t], A[t+1]); C.push_back(x); t += 2; }
int q = 0;
while (q < (C.size() - 1)){
findDistance(C[q].first, C[q].second);
q++;
}
然后,使用距离函数找到所有距离,其中结果存储在向量B中。这是函数。
void 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);
B.push_back(final);
}
bucketsort组织所有距离,并将结果存储在B中。
void bucketSort(vector<double> &arr)
{
int n = B.size();
vector<double> 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]; }
}
}
这就是问题所在。B被排序了,但C保持原来的顺序。要查找并比较表之间的值以找到正确的顺序,成本太高。(其中一个参数是将运行时间保持为O(n)。我有什么办法解决这个问题吗?
这是我的完整代码:
vector<double> A;
vector<double> B;
vector<pair<double,double>> C;
void 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);
B.push_back(final);
}
void bucketSort(vector<double> &arr)
{
int n = B.size();
vector<double> 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; pair<double,double> x;
while (cin >> number){
A.push_back(number); }
while (t < A.size()){
x = make_pair(A[t], A[t+1]); C.push_back(x); t += 2; }
cout << setprecision(5); cout << fixed;
int q = 0; double r = 0; double d = 0;
while (q < (C.size() - 1)){
findDistance(C[q].first, C[q].second);
q++;
}
bucketSort(B);
cout << showpos; cout << fixed;
//more cout here to show results
}
以下是输入和输出示例:输入:
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
如有任何帮助,我们将不胜感激。
首先,我认为您应该决定是真的需要知道距离,还是只需要它们来对点向量进行排序。如果你不需要它们,就没有必要单独存放。我要做的是:
- 创建一个Point类(其成员为x和y)
- 为它定义比较运算符(以便能够排序)
- 从用户输入中获取积分(几乎和现在一样)
- 调用标准排序算法
此外,实现类似double get_distance()
的成员函数可能是有用的。此外,如果您计划多次获得它,则成员double distance
可能会很有用。
作为替代方案,您可以为pair<double,double>
元素定义比较函数,并在排序期间将其用作比较函数。
希望我写的有意义。
在这种情况下,一个常见的技巧是首先对辅助向量进行排序,该向量包含您真正想要排序的向量的索引。也就是说,您不是按i<j
而是按B[i] < B[j]
对vector<size_t> H
进行排序。
然后,创建Bnew[i] = B[H[i]]
和Cnew[i] = C[H[i]]
。
- 查找两个排序向量中共有的元素
- 高级选择排序 - 在一次迭代中搜索两个元素
- 为什么在排序链表上的这种合并实现总是将两个列表都设置为 NULL,而只有一个应该设置一个列表?
- 合并两个排序链表时运行时出错
- 在 C++ 中合并两个排序链表
- 使用运算符+将两个已排序的链表合并到位
- 如何同时对两个或三个数组进行排序?
- 在这种单例实施中,是否可以对两个商店重新排序?
- 如何使用排序和比较这两个函数在 c++ 中对字符数组进行排序?
- 两个排序的链接列表C 的交点
- R- armadillo c :用其他两个向量对向量进行排序
- 使用推力使用sort_by_key对两个OpenGL缓冲区进行排序
- 合并两个排序的链表
- C 我将如何使用排序对这两个维数组进行排序
- 合并两个排序的列表 - 不起作用
- 按两个条件对lambda表达C 进行排序
- 是否存在用于按以下方式对两个范围进行排序和分区的标准算法?
- 使用不同的比较函数合并两个排序的双向量
- 使用两个条件对对象的向量进行排序
- 如何在没有 c++ 中的数组/算法的情况下对两个条件的字符串进行排序