假设我们有以下二维整数数组:
1 3 3 1
1 0 2 2
2 0 3 1
1 1 1 0
2 1 1 3
我试图创建一个实现,用户可以将数组本身和字符串作为输入。上面示例中的字符串示例03
将意味着用户希望根据第一列和第四列对数组进行排序。
所以在这种情况下,排序的结果如下:
1 1 1 0
1 3 3 1
1 0 2 2
2 0 3 1
2 1 1 3
我不太了解 STL 函数中使用的比较函数sort
,但是在搜索后我创建了以下简单实现:
我创建了一个名为Comparator.h
class Comparator{
private:
std::string attr;
public:
Comparator(std::string attr) { this->attr = attr; }
bool operator()(const int* first, const int* second){
std::vector<int> left;
std::vector<int> right;
size_t i;
for(i=0;i<attr.size();i++){
left.push_back(first[attr.at(i) - '0']);
right.push_back(second[attr.at(i) - '0']);
}
for(i=0;i<left.size();i++){
if(left[i] < right[i]) return true;
else if(left[i] > right[i]) return false;
}
return false;
}
};
我需要知道字符串中的信息,所以我需要有一个类,这个字符串是一个私有变量。在operator
I 内部有两个参数first
和second
,每个参数都指向一行。现在有了这些信息,我创建了一个left
和一个right
向量,其中在left
向量中我只有对first
排序很重要并且由字符串变量指定的行号,在right
向量中我只有second
重要的行号到排序并由字符串变量指定。
然后我进行所需的比较并返回真或假。用户可以通过在类中调用这个函数来使用这个Sorting.cpp
类:
void Sorting::applySort(int **data, std::string attr, int amountOfRows){
std::sort(data, data+amountOfRows, Comparator(attr));
}
这是一个使用示例:
int main(void){
//create a data[][] variable and fill it with integers
Sorting sort;
sort.applySort(data, "03", number_of_rows);
}
我有两个问题:
第一个问题
我的实施能变得更好吗?我使用了额外的变量,比如left
和right
向量,然后我有一些 for 循环,这给排序操作带来了一些额外的成本。
第二个问题
由于额外的成本,排序的时间复杂度会变差多少?我知道 STLsort
是O(n*logn)
您n
要排序的整数的数量。这里n
有不同的含义,n
是行数,每行最多可以有m
整数,而这些整数又可以Comparator
通过覆盖operator
函数并使用额外的变量(向量)和 for 循环在类中找到。
因为我不确定 STL 是如何sort
实现的,所以我只能做一些估计。我最初的估计是对排序很重要的列数在O(n*m*log(n))
哪里m
,但我不能 100% 确定它。
先感谢您