[英]C++: Implementing merge sort from scratch
I was trying to test my self and wanted to write mergesort, without actually looking up any code online, and to do it in a certain time period. 我试图测试自己,想要编写mergesort,而不是实际在线查找任何代码,并在一段时间内完成。 I am stuck at this point where I cannot simply understand what I am doing wrong, since merge sort, as much as i remember, is to divide the strings up to the point where string is only 1 character and later on merge them back together.
我被困在这一点上,我不能简单地理解我做错了什么,因为合并排序,就像我记得的那样,是将字符串分成字符串只有1个字符然后将它们合并在一起的点。 The code I've written below
tries to do the exact thing.
我在下面写的代码试图做到确切的事情。 I was wondering whether I got the
concept wrong, or just
my implementation ?
我想知道我的概念是错误的,还是
我的实施 ?
string merge(string str1, string str2) {
string final = "";
int i = 0, j = 0;
bool fromStr1 = false;
while(true) {
if(str1[i] < str2[j]) {
final += str1[i];
i++;
if(i == str1.size()) {
break;
}
}
else {
final += str2[j];
j++;
if(j == str2.size()) {
break;
fromStr1 = true;
}
}
}
if(fromStr1) {
for(int t = i; t < str1.size(); t++) {
final += str1[t];
}
}
else {
for(int t = j; t < str2.size(); t++) {
final += str2[t];
}
}
return final;
}
string mergeSort(string str1, int start, int end) {
if(end - start == 1)
return str1;
else {
int pivot = (end - start) / 2;
string newStr1 = mergeSort(str1, start, pivot);
string newStr2 = mergeSort(str1, pivot + 1, end);
return merge(newStr1, newStr2);
}
}
This doesn't look right: 这看起来不正确:
int pivot = (end - start) / 2;
string newStr1 = mergeSort(str1, start, pivot);
string newStr2 = mergeSort(str1, pivot + 1, end);
Don't you mean pivot=(end+start)/2
? 你不是指
pivot=(end+start)/2
? Or else mergeSort(str1, start, start+pivot)
and mergeSort(str1, start+pivot+1, end)
? 或者
mergeSort(str1, start, start+pivot)
和mergeSort(str1, start+pivot+1, end)
?
EDIT:
编辑:
And your merge
doesn't cope well with empty strings. 你的
merge
不能很好地处理空字符串。 You should have tested this function before hooking it up to mergeSort
. 你应该在将它连接到
mergeSort
之前测试过这个函数。
Note the changes: 请注意更改:
#include <iostream>
#include <string>
using namespace std;
string merge(string str1, string str2) {
string final = "";
int i = 0, j = 0;
bool fromStr1 = false;
while (true) {
if (i >= (int)str1.size()) {
break;
}
if (j >= (int)str2.size()) {
fromStr1 = true; // changed the order of this with break!
break;
}
if (str1[i] < str2[j]) {
final += str1[i];
i++;
}
else {
final += str2[j];
j++;
}
}
if (fromStr1) {
for (int t = i; t < (int)str1.size(); t++) {
final += str1[t];
}
}
else {
for(int t = j; t < (int)str2.size(); t++) {
final += str2[t];
}
}
return final;
}
string mergeSort(string str1) {
int len = str1.size();
if (len <= 1)
return str1;
else {
string newStr1 = mergeSort(str1.substr(0, len / 2));
string newStr2 = mergeSort(str1.substr(len / 2, len - len / 2));
return merge(newStr1, newStr2);
}
}
int main()
{
cout << '"' << mergeSort("") << '"' << endl;
cout << '"' << mergeSort("a") << '"' << endl;
cout << '"' << mergeSort("ba") << '"' << endl;
cout << '"' << mergeSort("132") << '"' << endl;
cout << '"' << mergeSort("4321") << '"' << endl;
cout << '"' << mergeSort("54321") << '"' << endl;
return 0;
}
Output ( ideone ): 输出( ideone ):
""
"a"
"ab"
"123"
"1234"
"12345"
It's been ages since I used C++, but doesn't break
immediately exit the loop? 它一直年龄,因为我用C ++,但不会
break
立即退出循环? Because fromStr1 = true;
因为
fromStr1 = true;
is never reached in that case. 在那种情况下从未达成过。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.