我的任务是通过升序或降序值来创建一个字符串,这样我就可以解决剩下的问题了。我选择了降序,它只适用于所有输出。我不能使用任何额外的内存,它必须在O(n log n)中运行所以我知道我应该使用一个heapsort。我知道如何使用O(n)额外的内存进行堆垛但是到位给我带来了麻烦。我的问题是我的字符串中的第一个字符永远不会被排序。其他所有内容都已排序,我理解为什么它没有排序,我无法找出解决方案。
以我的理解为HeapSort:
1)将堆底部的项目(“字符串中的最后一个元素”)交换到根
2)使用fixDown通过与孩子进行比较来向下滴流该角色
第一个字符没有被排序,因为一旦我将它与最后一个元素交换,我将其视为已排序。
我提出的解决办法就是用字符串的最小字符替换字符串的第一个字符,这样当我进行初始交换时,它就会被排序。这带来了更多问题。
我的第二个提议解决方案是调用fixDown(s,s.size() - 1,0)。这样我们每次使用整个字符串时都会向下移动顶部元素,但这使我离解决方案更远。
感谢您的帮助,我真的想学习如何解决这个问题,在此之前我一直在尝试许多不同的事情。
void count_chars(string s){
for(unsigned int i=s.size()-1;i>0;--i){
swap(s.at(i),s.at(0));
fixDown(s,i-1,0);
}
cout<<s<<endl;
}
static void fixDown(string &s,int size,int k){
while(2*k+1<=size){
int j=2*k+1;
if(j<size && s.at(j) > s.at(j+1))
++j;
if(s.at(k)<=s.at(j))
break;
swap(s.at(k),s.at(j));
k=j;
}