1

C++ プログラミングを学んでいますが、基本的な配列ソート プログラムに問題があります。私のコードはコンパイラ エラーをスローしていないようです - VisualStudio2012 はエラーを表示しません。また、チュートリアル (learncpp.com) で見つけたコードとまったく同じようです。

出力は、選択ソートのすべてのステップで配列を表示することになっています。ただし、ランダムな文字と数字のさまざまな出力が得られます。これはメモリの問題ですか?または、他の何か?

また、コメントアウトされた「if」ループは、2 行のコードではなく 1 行で配列要素を交換する方法でした。それはソートに役立ちますか?

#include "stdafx.h"
#include <iostream>
#include <algorithm>

int _tmain(int argc, _TCHAR* argv[])
{
using namespace std;

const int nSize = 6;
int anArray[nSize] = {30, 60, 20, 50, 40, 10};

for (int nStartIndex = 0; nStartIndex < nSize; nStartIndex++){
    int nSmallestIndex = nStartIndex;

    for (int nCurrentIndex = nSmallestIndex + 1; nCurrentIndex < nSize; nCurrentIndex++){


    /*  if (anArray[nCurrentIndex] < anArray[nSmallestIndex])
            swap(anArray[nSmallestIndex], anArray[nCurrentIndex]);
    */

        if (anArray[nCurrentIndex] < anArray[nSmallestIndex])
        nSmallestIndex = nCurrentIndex;
    }

    swap(anArray[nStartIndex], anArray[nSmallestIndex]);

    cout << "The current array: \t" << anArray << "\n";

}

return 0;

}

4

3 に答える 3

1

あなたの表示0x23abcdは、メモリアドレスのようなものです。実際には、配列の最初の要素へのポインターを表示しています。C++11 で配列を適切に表示するには、range-for ループを使用するのが最善の方法です。

for(int &i : anArray)
        std::cout << i << " ";
于 2013-07-23T16:15:24.573 に答える
1

おそらく、ループを使用して配列の内容を出力してみてください。

for(int i=0; i<anArray.size(); i++)
    std::cout<< anArray[i] << " ";

編集: @awesomeyi によって提供されたソリューションは、よりエレガントに見えます。

于 2013-07-23T16:19:59.987 に答える
0

コード部分の代わりに:

cout << "The current array: \t" << anArray << "\n";

これを使って

cout << "The current array: \t";
for(int i=0;i<nSize;i++)
{
    cout<<anArray[i]<<" ";
}
cout<<endl;

これは機能すると思いますが、ヘッダー<algorithm>を使用しているため、関数sort()を使用して配列を複雑にソートできますnlogn。例はこちら

#include <iostream>
#include <algorithm>

int main()
{
using namespace std;

const int nSize = 6;
int anArray[nSize] = {30, 60, 20, 50, 40, 10};

sort(anArray,anArray+6);

    cout << "The current array: \t";
    for(int i=0;i<nSize;i++)
    {
        cout<<anArray[i]<<" ";
    }
    cout<<endl;



return 0;
}
于 2013-07-23T16:35:14.093 に答える