- ベストアンサー
C++ ソートのやり方
- C++ ソートの方法とは?バブルソートなのか他の方法も教えてください
- C++プログラムでバブルソートを使っているが、他のソート方法も知りたい
- C++プログラムにおけるソートのやり方について教えてください
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
バブルソートではないですね。 http://ja.wikipedia.org/wiki/%E3%83%90%E3%83%96%E3%83%AB%E3%82%BD%E3%83%BC%E3%83%88 選択ソートではないかと思います。 http://ja.wikipedia.org/wiki/%E9%81%B8%E6%8A%9E%E3%82%BD%E3%83%BC%E3%83%88 > また、ほかのソートの仕方も教えてください。 「ソート アルゴリズム」などで検索するといっぱい見つかると思います。 他の回答である通り、C++でプログラムを書くとしたら、std::sortを使うのが普通です。今回は勉強のために自分で書いてみているのでしょうけれど。 quick sortとか? template <typename T> void Swap(T& i0, T& i1) { T tmp = i0; i0 = i1; i1 = tmp; } template <typename BiderectIter> void QuickSort(BiderectIter begin, BiderectIter end) { typedef typename std::iterator_traits<BiderectIter>::value_type value_type; if (begin < end) { BiderectIter pivot_index = end - 1; value_type pivot_value = *(end - 1); BiderectIter store_index = begin; for (BiderectIter it = begin; it != end - 1; it++) { if (*it < pivot_value) { Swap(*it, *store_index); store_index++; } } Swap(*store_index, *pivot_index); QuickSort(begin, store_index); QuickSort(store_index + 1, end); } } merge sortとか? template <typename Iter> void Merge(Iter begin, Iter middle, Iter end) { typedef typename std::iterator_traits<Iter>::value_type type; std::vector<type> tmp; tmp.reserve(end - begin); Iter fhead = begin, lhead = middle; while (fhead != middle && lhead != end) { if (*fhead < *lhead) { tmp.push_back(*fhead); fhead++; } else { tmp.push_back(*lhead); lhead++; } } if (fhead == middle) { for (; lhead != end; lhead++) { tmp.push_back(*lhead); } } if (lhead == end) { for (; fhead != middle; fhead++) { tmp.push_back(*fhead); } } Iter it = begin; for (size_t i = 0; i < tmp.size(); i++) { *it++ = tmp[i]; } } template <typename Iter> void MergeSort(Iter begin, Iter end) { size_t size = end - begin; if (size < 2) return; Iter middle = begin + size / 2; MergeSort(begin, middle); MergeSort(middle, end); Merge(begin, middle, end); } 呼び出し方はこんな感じになりますが。 QuickSort(&c[0], &c[10]); MergeSort(&i[0], &i[10]);
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
ふつう, バブルソートというと「隣接する要素を比較する」ものを指すはずだから, これは「バブルソート」とはみなさないんじゃないかな. どちらかというと, 無駄にいっぱい交換をする選択ソートって感じ.
お礼
回答ありがとうございました。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
バブルではなさそう。 バブルソートは 「i 番目 と i+1番目を比較し、逆順なら入れ替える」 を繰り返します。比較/交換を隣同士で行うのがバブルソートです。 > ほかのソートの仕方も教えてください。 #include <algorithm> int main() { int i[10]{1, 4, 3, 5, 2, 10, 2, 7, 6, 8}; char c[10]{'c', 'b', 'z', 'a', 'x', 'y', 'j', 'n', 'm', 'r'}; std::sort(i, i+10); std::sort(c, c+10); }
お礼
ありがとうございます。 ヘッダーファイルを使ったソートはわかるのですが、内部でどのような動作をしているのかわからなかったので、ソートアルゴリズムを勉強中で質問させていただきました。
- maiko0318
- ベストアンサー率21% (1483/6969)
バブルソートといいます。 内側のループを抜けると一番小さなものがdata[0]に確定しますよね。 次は2番めに小さなものがdata[1]に確定します。 data[]を上からdata[0]、data[1]・・・と並べてこの状態を見ていると 泡(data[i])が下から沸き上がってくるようにみえることからこの名が付いています。 このソートはデータが倍になると4倍、3倍になると9倍の時間がかかります。 わかりやすいですがデータ量が多いと遅いソートです。 早いのはクイックソート。これはデータ量が倍になっても2倍、 3倍になっても3倍の時間しかかかりません。 その代わり、プログタラムは複雑でわかりにくいものとなります。 その中間、わかりやすくて早いのがシェルソートです。
お礼
回答ありがとうございました。
お礼
ありがとうございました。 色々なソートのアルゴリズムも答えてくれてありがとうございました。