- for (int i = smaller.size(); i < larger.size(); i++) {
- it = seen.find(larger[i]);
- if (it == seen.end()) {
- mergedResults.push_back(larger[i]);
- seen[larger[i]] = larger[i];
+ //save lasti for smaller ties below
+ lasti++;
+ int iSmaller = lasti;
+
+ if (!(mergedResults.size() > num)) { //if we still need more results.
+ for (int i = smaller.size(); i < larger.size(); i++) {
+ it = seen.find(larger[i]);
+ if (it == seen.end()) {
+ mergedResults.push_back(larger[i]);
+ seen[larger[i]] = larger[i];
+ lastLarger = largerScores[i];
+ }
+
+ lasti = i;
+ if (mergedResults.size() > num) { break; }
+ }
+ }
+
+
+ //add in any ties from smaller
+ while (iSmaller < smaller.size()) {
+ if (smallerScores[iSmaller] == lastSmaller) {
+ it = seen.find(smaller[iSmaller]);
+
+ if (it == seen.end()) {
+ mergedResults.push_back(smaller[iSmaller]);
+ seen[smaller[iSmaller]] = smaller[iSmaller];
+ }
+ }
+ else { break; }
+ iSmaller++;
+ }
+
+ lasti++;
+ //add in any ties from larger
+ while (lasti < larger.size()) {
+ if (largerScores[lasti] == lastLarger) { //is it a tie
+ it = seen.find(larger[lasti]);
+
+ if (it == seen.end()) { //we haven't already seen it
+ mergedResults.push_back(larger[lasti]);
+ seen[larger[lasti]] = larger[lasti];
+ }