21xrx.com
2024-09-20 06:43:09 Friday
登录
文章检索 我的文章 写文章
C++ Sort 排序混乱问题
2023-07-09 22:05:20 深夜i     --     --
C++ Sort 排序 混乱问题 Bug

C++是一门强大的编程语言,广泛应用于数据处理和算法开发。其中排序算法是一个非常重要的知识点,也是面试中常考的部分。然而,C++的排序函数在使用时经常会出现混乱的问题,让人困惑不解。

让我们来看一下最经常使用的排序函数——sort()。根据C++官方文档的描述,sort()可以对容器中的元素进行升序或降序排列,例如sort(v.begin(), v.end())可以对一个vector容器中的元素按照升序排列。然而,如果我们输入以下代码:


vector<int> v = 4;

sort(v.begin(), v.end());

for(auto i : v)

  cout<<i<<" ";

我们期望的输出应该是1,2,3,4,但是实际上输出的结果是1,2,3,4或者4,3,2,1。也就是说,sort()函数并没有按照我们的期望输出升序排列。

我们可能会认为这是因为sort()默认是以升序排列的,而我们期望的是降序排列,因此需要在sort()中加入参数,例如sort(v.begin(), v.end(), greater ())就可以实现将vector中的元素按照降序排列。但是,即使我们这样修改代码,我们依然会面临着另一个问题。

下面是一个例子:


class student{

public:

  string name;

  int score;

  student(string n, int s)

    name = n;

    score = s;

  

};

bool cmp(student a, student b){

  if(a.score == b.score)

    return a.name < b.name;

  return a.score > b.score;

}

int main(){

  vector<student> v;

  v.push_back(student("Alice",80));

  v.push_back(student("Bob",90));

  v.push_back(student("Carol",70));

  v.push_back(student("David",90));

  sort(v.begin(), v.end(), cmp);

  for(auto i : v)

    cout<<i.score<<" "<<i.name<<endl;

  return 0;

}

我们期望的输出结果是90 Bob,90 David,80 Alice,70 Carol。但是实际上,输出结果却是90 Bob,90 David,70 Carol,80 Alice。也就是说,我们并不能保证sort()在使用自定义的比较函数时能够按照我们期望的方式进行排列。

那么,C++中的sort()函数出现这种混乱问题是为什么呢?其实,这是由于sort()的底层实现原理产生的。sort()采用的是快速排序算法,在遇到可等关键字时,会使用插入排序优化。而插入排序会根据相邻元素的比较结果调整两个元素的位置,这就导致了sort()在使用自定义比较函数时可能会出现混乱的问题。

那么,如何解决这个问题呢?一种可行的方法是使用稳定排序算法,例如归并排序,这可以保证自定义的比较函数不会影响到排序的结果。但是,这种方法会带来额外的时间和空间复杂度的消耗。

总结来说,C++中的sort()函数在使用时需要谨慎,尤其是在面临自定义比较函数时更加需要留心。我们需要理解sort()底层的实现机制,以避免出现不必要的混乱问题。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复