発生している問題・エラーメッセージ
統治分割法を使っているマージソートのプログラムを追っているところわからないところが出ました。
結果だけで見て7行目の[6,7,4,5,3,2,1,0]の部分から[4,5,6,7,3,2,1,0]になるのがわかりません。
(a,0、4)の関数の時
下の部分コードを見てみると
int index_left = 0;
int index_right = (int)buf.size() - 1;
index_left = 0でいいと思うのですが
int index_right は (int)buf.size() - 1となっていて要素で言うと添字3(一番はじの5)を示していると思いました。
すると、配列[5、4、6、7、3、2、1、0]になると思うのですが、[4,5,6,7,3,2,1,0]になります。
ご指摘お願いします。
前提
配列
N=8
[7,6,5,4,3,2,1,0]
#include <iostream> #include <vector> using namespace std; void dumpVector(vector<int>&a) { cout << "["; bool first = true; for (auto v: a) { if (first) first = false; else cout << ","; cout << v; } cout << "]" << endl; } void MergeSort(vector<int> &a, int left, int right) { if (right - left == 1) return; cout << "[" << left << "," << right << ")" << endl; int mid = left + (right - left) / 2; MergeSort(a, left, mid); MergeSort(a, mid, right); vector<int> buf; for (int i = left; i < mid; ++i) buf.push_back(a[i]); for (int i = right - 1; i >= mid; --i) buf.push_back(a[i]); int index_left = 0; int index_right = (int)buf.size() - 1; for (int i = left; i < right; ++i) { if (buf[index_left] <= buf[index_right]) { a[i] = buf[index_left++]; } else { a[i] = buf[index_right--]; } } dumpVector(a); } int main() { int N = 8; vector<int> a(N); for (int i = 0; i < N; ++i) a[i] = N - 1 - i; dumpVector(a); MergeSort(a, 0, N); return 0; }
結果
[7,6,5,4,3,2,1,0]
[0,8)
[0,4)
[0,2)
[6,7,5,4,3,2,1,0]
[2,4)
[6,7,4,5,3,2,1,0]
[4,5,6,7,3,2,1,0]
[4,8)
[4,6)
[4,5,6,7,2,3,1,0]
[6,8)
[4,5,6,7,2,3,0,1]
[4,5,6,7,0,1,2,3]
[0,1,2,3,4,5,6,7]
回答1件
あなたの回答
tips
プレビュー