2016-08-30 11 views
-2

これは、C++のベクトルを使用したマージソート用の私のコードです。しかし、それは私に奇妙な結果を投げている:なぜ私のmerge_sortがC++で動作していないのですか?

結果:

入力要素:11の33 12 44 99 34

ソート要素:11 33 33 44 99 99

私のヘッダーをファイルは何も特別なものではありません: "stdafx.h"

#pragma once 

#include "targetver.h" 
#include <stdio.h> 
#include <tchar.h> 
#include <iostream> 
using namespace std; 

コード:

#include "stdafx.h" 
#include <iostream> 
#include<array> 
#include<vector> 

//#define array_size(array) (sizeof((array))/sizeof((array[0]))) 

using namespace std; 
template <typename T> 
void merge_sort(vector<T>& arr, vector<T>& arr1, vector<T>& arr2) { 
    arr.clear(); 
    int i = 0, j = 0, k = 0; 

    for (i = 0; i < arr1.size() && j < arr2.size(); k++) { 
     if (arr1.at(i) <= arr2.at(j)) { 
      arr.push_back(arr1.at(i)); 
      i++; 
     } 
     else if (arr1.at(i) > arr2.at(j)) { 
      arr.push_back(arr1.at(j)); 
      j++; 
     } 
     k++; 
    } 
    while (i < arr1.size()) { 
     arr.push_back(arr1.at(i)); 
     i++; 
    } 

    while (j < arr2.size()) { 
     arr.push_back(arr2.at(j)); 
     j++; 
    } 

}; 

template <typename T> 
vector<T>merge(std::vector<T>& arr) { 
    if (1 < arr.size()) { 
     vector<T> arr1(arr.begin(), arr.begin() + arr.size()/2); 
     merge(arr1);//dividing to size 1 

     std::vector<T> arr2(arr.begin() + arr.size()/2, arr.end()); 
     merge(arr2); 
     merge_sort(arr, arr1, arr2); 

    } 
    return (arr); 
    //write_vector(arr); 
}; 


int main() 
{ 
    //Merge Sort 

    vector<int> inputVec; 
    int size = 6; 

    for (int i = 0; i < size; i++) { 
     int input; 
     cin >> input; 
     inputVec.push_back(input); 
    } 

    vector<int>& newSort=merge(inputVec); 
    vector<int>::iterator it; 
    for (it = newSort.begin(); it != newSort.end(); ++it) 
     cout<<endl<< *it << endl; 
    return 0; 
} 

結果ウィンドウ: My Output いくつかのいずれかが間違っているものを指摘していただけますか?重複要素を作成するのはなぜですか?

+6

デバッガを使用してコードをステップ実行する方法を学ぶ必要があるようです。良いデバッガを使用すると、プログラムを1行ずつ実行し、どこからずれているかを確認することができます。これはプログラミングをする場合に不可欠なツールです。詳しい読書:** [小さなプログラムをデバッグする方法](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver

+1

'arr.push_back(arr1.at( j));は間違っています。 –

+2

'ベクトル&newSort =マージ(inputVec);' MS VS?これは不正なC++コードです。 – Slava

答えて

0

merge_sort機能であなたのコードを参照してください:

for (i = 0; i < arr1.size() && j < arr2.size(); k++) { 
    if (arr1.at(i) <= arr2.at(j)) { 
     arr.push_back(arr1.at(i)); 
     i++; 
    } 
    else if (arr1.at(i) > arr2.at(j)) { 
     arr.push_back(arr1.at(j)); 
     //   ^^^^ 
     // It should be arr.push_back(arr2.at(j)); 
     j++; 
    } 
    k++; 
} 

arr.push_back(arr2.at(j));arr.push_back(arr1.at(j));を交換し、あなたのコードは魅力のように動作します。

+0

ありがとうございました!それは本当に私の愚かだった。ありがとう。 –

関連する問題