質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

770閲覧

分布数えソートでメモリエラー

asobinin

総合スコア69

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/01/04 17:17

c++にて分布数えソートテンプレートを作成してみたのですが、どこかにミスがあるようでメモリエラーが出てしまいます。
どこが間違っているかご指摘ください。

C++

1template <typename T> void countingSort(T ary[], const size_t ary_num) { 2 T max = aryMax(ary, ary_num); // 要素の最大値 3 T min = aryMin(ary, ary_num); // 要素の最小値 4 std::vector<int> count(max - min + 1); 5 std::vector<T> copy(ary_num); 6 size_t i; 7 8 std::fill(count.begin(), count.end(), 0); 9 std::fill(copy.begin(), copy.end(), 0); // debug 10 11 for (i = 0; i < ary_num; i++) count[ary[i] - min]++; 12 for (i = 1; i <= max - min; i++) count[i] += count[i - 1]; 13 for (i = ary_num - 1; i >= 0; i--) // ここが怪しい? 14 copy[--count[ary[i] - min]] = ary[i]; 15 for (i = 0; i < ary_num; i++) 16 ary[i] = copy[i]; 17 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

推測の場所が問題です。
iunsignedなので負値にならず無限ループに陥ります。
修正するにはたとえばisignedで定義する必要があります。

投稿2019/01/04 17:26

can110

総合スコア38266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asobinin

2019/01/04 17:46

無事解決しました、ありがとうございます。 ループの条件が i>=0なのにiが0より小さくならないんじゃそりゃダメなわけですねw
asobinin

2019/01/04 17:56

メモリエラーはary[unsigned 0 - 1]でとんでもなく見当違いなところにアクセスしていたため起こっていたんですね・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問