2015-06-21 2 views
1

Я использую g ++ -std = C++ 11 Sort.cpp для компиляции моего файла.C++ vector bubble sort

Моя проблема в том, что сортировка пузыря не сортируется.

Может быть, я передаю вектор по значению, но я не знаю, насколько мне нравится время работы с C++, и я выбрал использование векторной библиотеки.

Мой код:

#include <iostream> 
#include <vector> 

using namespace std; 

void bubbleSort(vector<int> a); 

void printVector(vector<int> a); 

int main(int argc, char const *argv[]) 
{ 
    vector<int> a{3,2,6,1}; 
    printVector(a); 

    bubbleSort(a); 
    printVector(a); 
} 

void bubbleSort(vector<int> a) 
{ 
    bool swapp = true; 
    while(swapp) 
    { 
     swapp = false; 
     for (int i = 0; i < a.size()-1; i++) 
     { 
      if (a[i]>a[i+1]) 
      { 
       a[i] += a[i+1]; 
       a[i+1] = a[i] - a[i+1]; 
       a[i] -=a[i+1]; 
       swapp = true; 
      } 
     } 
    } 
} 

void printVector(vector<int> a) 
{ 
    for (int i=0; i <a.size(); i++) 
    { 
     cout<<a[i]<<" "; 
    } 
    cout<<endl; 
} 

В основном я объявляю вектор типа INT и сделать список {3,2,6,1}

После этого е вызовите функцию printVector Wich претендует на печать всех номеров вектора на консоли и вызывает функцию bubbleSort и, наконец, печатает снова.

+3

Пропустите вектор по ссылке: 'недействительным BubbleSort (вектор & а)' –

+1

Помимо: умные трюки обменивать, скорее всего, больно, чем помочь в эти дни. – Hurkyl

ответ

5

Вам необходимо пройти по ссылке; сделав копию, вы сортируете временную копию, и тогда все; он исчезает, а оригинал все еще несортирован, потому что, опять же, вы отсортировали только временную копию всего вектора.

So change vector<int> a to vector<int>& a.

Вот код, исправлено:

http://coliru.stacked-crooked.com/a/2f118555f585ccd5

#include <iostream> 
#include <vector> 

using namespace std; 

void bubbleSort(vector<int>& a); 

void printVector(vector<int> a); 

int main(int argc, char const *argv[]) 
{ 
vector<int> a {3,2,6,1}; 

printVector(a); 

bubbleSort(a); 

printVector(a); 



} 

void bubbleSort(vector<int>& a) 
{ 
     bool swapp = true; 
     while(swapp){ 
     swapp = false; 
     for (size_t i = 0; i < a.size()-1; i++) { 
      if (a[i]>a[i+1]){ 
       a[i] += a[i+1]; 
       a[i+1] = a[i] - a[i+1]; 
       a[i] -=a[i+1]; 
       swapp = true; 
      } 
     } 
    } 
} 

void printVector(vector<int> a){ 
    for (size_t i=0; i <a.size(); i++) { 
     cout<<a[i]<<" "; 

    } 
    cout<<endl; 
} 
+0

@warwcat Вы должны принять ответ с галочкой. – VermillionAzure

2

Вы передаете векторы как значения вашим функциям, что означает, что вы сортируете копию, а не исходный вектор, а затем печатаете копию исходного вектора.

Изменение параметра для vector<int> &a в функции bubbleSort и vector<int> const &a в функции printVector (как вам не нужно, чтобы изменить содержание вектора здесь).

К слову, ваш код может зависеть от неопределенного поведения, вызванного переполнением цепочки подписей. Вы должны использовать другой метод, чтобы обменять свои элементы, std::swap, например:

std::swap(a[i], a[i + 1]); 
+0

спасибо, что я не знаю эту функцию обмена, спасибо большое – warwcat

0

я застрял на нем, а также на некоторое время. Этот вопрос уже был хорошо отреагирован VermillionAzure, но все еще вставлял мое решение. Я не использую std :: swap только потому, что мне нравится делать больше вручную.

#include <iostream> 
#include <vector> 

//function to swap values 
//need to pass by reference to sort the original values and not just these copies 
void Swap (int *a, int *b) 
{ 
    int temp = *a; 
    *a = *b; 
    *b = temp; 
} 

void BubbleSort (std::vector<int> &array) 
{ 
    std::cout<<"Elements in the array: "<<array.size()<<std::endl; 

    //comparisons will be done n times 
    for (int i = 0; i < array.size(); i++) 
    { 
     //compare elemet to the next element, and swap if condition is true 
     for(int j = 0; j < array.size() - 1; j++) 
     { 
      if (array[j] > array[j+1]) 
       Swap(&array[j], &array[j+1]); 
     } 
    } 
} 

//function to print the array 
void PrintArray (std::vector<int> array) 
{ 
    for (int i = 0; i < array.size(); i++) 
     std::cout<<array[i]<<" "; 
    std::cout<<std::endl; 
} 

int main() 
{ 
    std::cout<<"Enter array to be sorted (-1 to end)\n"; 

    std::vector<int> array; 
    int num = 0; 
    while (num != -1) 
    { 
     std::cin>>num; 
     if (num != -1) 
      //add elements to the vector container 
      array.push_back(num); 
    } 

    //sort the array 
    BubbleSort(array); 

    std::cout<<"Sorted array is as\n"; 
    PrintArray(array); 

    return 0; 
}