2013-07-23 3 views
1

Я изучаю программирование на С ++, и у меня возникают проблемы с базовой программой сортировки массива. Мой код, похоже, не бросает никаких ошибок компилятора - VisualStudio2012 не показывает никаких ошибок. Кроме того, это похоже на код, который я нашел в своем учебнике (learncpp.com).Сортировка массивов C++, ошибка памяти?

Вывод должен отображать массив на каждом шаге его сортировки. Однако я продолжаю получать разные выходы случайных букв и цифр. Это проблема памяти? Или что-то другое?

Кроме того, прокомментированный цикл «if» состоял в том, как бы я заменил элементы массива в 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; 

}

+0

я несколько есть ощущение, что реальный код имеет обугленный isntead ИНТА для этого массива ... – PlasmaHH

+1

Ну, делая 'соиЬ <<«Текущий массив: \ т»<< anArray < <"\ n"; 'не будет печатать сам массив. Он будет печатать ** адрес ** массива. В случае массива 'char' вы получите содержимое массива, но это только потому, что' << 'обрабатывает массивы' char' специально. –

+0

Работа подкачки, просто не комментируйте ее и попробуйте. –

ответ

1

Что ваше отображение, что-то вроде 0x23abcd является адресом памяти. Фактически вы показываете указатель на первый элемент массива. Чтобы отобразить массив должным образом в C++ 11, лучший способ заключается в использовании диапазона для контура:

for(int &i : anArray) 
     std::cout << i << " "; 
+0

Я не думаю, что узнал о символе «&», но я просто сделаю свой собственный цикл. Спасибо за помощь – NewtoProgramming

1

Может быть, вы должны попробовать использовать цикл для вывода содержимого массива.

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

Редактировать: Решение, данное @awesomeyi, выглядит более элегантно.

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 complextiy. Пример здесь

#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; 
} 
Смежные вопросы