【发布时间】:2016-06-02 21:17:11
【问题描述】:
我正在研究合并排序的实现,它将按歌曲的长度对歌曲列表进行排序。我已经写了以下内容并且无法找出我的逻辑中的缺陷。这些函数不是返回排序列表,而是返回原始列表中间的一项列表。
vector<song> merge( vector<song> firstList, vector<song> secondList){
vector<song> outPut;
int i = 0; int n = 0;
while( outPut.size() < (firstList.size() + secondList.size()-1 )){
if( firstList[i].length < secondList[n].length){
outPut.push_back( firstList[i]);
i++;
}else{
outPut.push_back( secondList[n]);
n++;
}
}
return outPut;
}
vector<song> mergeSortLength( vector<song> playlist){
int scope = playlist.size()/2;
vector<song> firstHalf( &playlist[0], &playlist[scope]);
vector<song> secondHalf( &playlist[scope], &playlist[playlist.size()]);
if ( firstHalf.size() != 1){
firstHalf = mergeSortLength(firstHalf);
}
if ( secondHalf.size() != 1){
secondHalf = mergeSortLength( secondHalf);
}
return merge( firstHalf, secondHalf);
}
如果我改变 while 循环条件
( outPut.size() < (firstList.size() + secondList.size() -1)){
到
( outPut.size() < (firstList.size() + secondList.size())){
列表排序成功到一半,直到编译器吐出:
playList(27898,0x7fff78b7b000) malloc: * mach_vm_map(size=7526769998340063232) 失败(错误代码=3) * 错误:无法分配区域 *** 在 malloc_error_break 中设置断点进行调试 libc++abi.dylib:以 std::bad_alloc 类型的未捕获异常终止:std::bad_alloc 中止陷阱:6
我非常感谢任何人的帮助。我的眼睛因为盯着这个而变得模糊。
【问题讨论】:
-
这里是small test。我建议你拿你在链接上看到的代码,拿你的代码,仔细调试你的代码失败的地方,以及好的例子没有失败的地方。看起来你在模仿
std::inplace_merge,但你弄错了。 Here is another link 举个例子。 -
感谢您的提示。我会比较一下,如果有帮助,我会告诉你。
-
有什么理由不只实现 song::operator
标签: c++ sorting logic mergesort