对二维向量进行排序并保持对原始索引的跟踪

时间:2013-05-03 14:25:33

标签: c++ algorithm

我想按x排序n维点列表并存储其原始索引:

original=[(3,2,3)(1,2,1)(5,1,5)]
排序后

[(1,2,1)(3,2,3)(5,1,5)]

和索引:

store=[1,0,2]

我用vector< vector<double>来存储n维点:

a[0][0] = x, a[0][1] = y, a[0][2] = z, ... 

我写了一个mergesort来做,通过引用传输source调用 并通过引用传输result来获取索引。

我遇到了一个问题,如果我想打印结果,程序将关闭。

#include <vector>
#include <cmath>
#include <cfloat>
#include <iostream>
#include <algorithm>
using namespace std;

void merge(vector< vector<double> >& source, vector< int >& result, int lmin, int lmax, int rmin, int rmax){
    int i = lmin, j = rmin;
    while(i <= lmin && j <= rmin){
        //left > right
        if(source[i][0] > source[j][0]){
            source[i].swap(source[j]);
            //exchange result
            int temp = result[j];
            result[j] = result[i];
            result[i] = temp;

            i ++;
        }
        else if(source[i][0] < source[j][0])
            source[i].swap(source[j]);

            j ++;
        }

}

void merge_sort(vector< vector<double> >& source, vector< int >& result, int min, int max){
    if(max - min == 0){
            result[min] = min;
            return;
    }
    int median = (max - min) / 2;
    merge_sort(source, result, min , median);
    merge_sort(source, result, median + 1 , max);
    merge(source, result, min, median, median + 1, max);
}

int main(){

       vector < vector<double> >test (8, vector<double>(3));
       vector < int >result (8);
       vector < vector<double> >ttt;
    test[0][0]= 10;
    test[0][1]= 20;
    test[0][2]= 30;
    //(1,2,3)
    test[1][0]= 1;
    test[1][1]= 2;
    test[1][2]= 3;
    //(1000,2000,3000)
    test[2][0]= 1000;
    test[2][1]= 2000;
    test[2][2]= 3000;
    //(100,200,300)
    test[3][0]= 100;
    test[3][1]= 200;
    test[3][2]= 300;
    //(100,200,300)
    test[4][0]= 100;
    test[4][1]= 200;
    test[4][2]= 302;
    //(100,200,300)
    test[5][0]= 100;
    test[5][1]= 200;
    test[5][2]= 3030;
    //(100,200,300)
    test[6][0]= 1000000;
    test[6][1]= 2000000;
    test[6][2]= 3000000;
    test[7][0]= 10;
    test[7][1]= 20;
    test[7][2]= 30.5;
    merge_sort(test, result, 0 , 7);

    for (int i = 0; i < test.size(); i ++){
        for(int j = 0; j < test[i].size(); j ++){
            cout << test[i][j] << endl;
        }
    }

    for(int i = 0; i < result.size(); i ++)cout << result[i] << endl;
}

2 个答案:

答案 0 :(得分:1)

您一定要学习如何使用调试工具。一步一步地看看意外事件发生的地方。如果您还不知道如何使用,请尝试在此处插入cout。通过将变量打印到屏幕来观察变量的值。我相信在这种情况下,您将手动调试 * :)通过打印值,您可以逐步了解算法的工作原理。这是一个很好的做法。

int median = (max - min) / 2;

我相信你应该找到像unsigned int median = (int)floor((max+min)/2);

这样的中位数

max = 3min = 2。根据您的代码,中位数将是0,这是无关紧要的。此时,当您使用此参数调用mergesort时(min = 2,max = median = 0),下一个中位数将被计算为负指数。因此,使用unsigned int作为中值可帮助您检测问题。看,仔细选择类型实际上对你有所帮助,这种情况就是一个非常好的例子。

通过修复你的错误,你的程序将会终止。

答案 1 :(得分:1)

嗯,对于初学者:

int median = (max - min) / 2;

应该是

int median = (max + min) / 2;

您可能希望从implementing merge sort in C

开始

让自己成为一个好的调试器。此外,如果您发布了实际的错误消息,将来可能会获得更多有用的回复。