Magnahawk
Magnahawk

Reputation: 9

C++ Bubble Sort Using Swap Function and Pointers

I'm having problems figuring out where my bubble sort code went wrong. I'm almost positive it's in the sorting algorithm. Here is what I need my code to accomplish:

-Initialize an array a fill it with random numbers (I use getNumbers() to accomplish this)

-Compare the first element with all later elements. If the first element is larger, swap them.

-Compare the second element with all later elements one by one. If the second element is larger, swap them.

-Continue comparing and swap operations until the second to last element.

-Print out the sorted array

And here's my code:

#include <iostream>
#include <cstdlib>

using namespace std;

void swap(int *, int *);

int *getNumbers(int);

int main()
{
    //Get the size of the array from keyboard
    int arraySize;
    cout << "How many integers would you like to declare: ";
    cin >> arraySize;

    //Initialize array  
    int *array;
    array = getNumbers(arraySize); //getNumbers should return a pointer
    //Print out original array
    cout << "Original array" << endl;
    for(int count = 0; count < arraySize; count++)
    {
        cout << *(array + count) << " ";
    }
    //Sort array using the swap function
    //Have a for loop to swap numbers one by one from min to max
        //Compare values using a second for loop
            //Swap values if former value is larger
            //swap(&array[i],&array[j]);
    for(int i = 0; i < arraySize; i++)
    {
        for(int j = 0; j < (arraySize - 1); j++)
        {
            if(array[j] > array[j + 1])
            {
                swap(&array[i], &array[j]);
            }
        }
    }
    //Print out sorted array
    cout << "\nSorted Array" << endl;
    for(int count = 0; count < arraySize; count++)
    {
        cout << *(array + count) << " ";
    }
    return 0;
}

void swap(int *num1, int *num2)
{
    //Keep record of original value of num1
    int tempNum;
    tempNum = *num1;
    *num1 = *num2;  //num1 value has been changed
    *num2 = tempNum;    //Fetch the original value of num1 and assign it to num2
}

int *getNumbers(int size)
{
    int *array;

    array = new int[size];

    srand(time(0));

    for(int i = 0; i < size; i++)
    {
        array[i] = rand() % 100;
    }
    return array;
}

Upvotes: 0

Views: 6711

Answers (2)

nishantsingh
nishantsingh

Reputation: 4662

Here is the correct code.

#include <iostream>
#include <cstdlib>

using namespace std;

void swap(int *, int *);

int *getNumbers(int);

int main() {
  //Get the size of the array from keyboard
  int arraySize;
  cout << "How many integers would you like to declare: ";
  cin >> arraySize;

  //Initialize array
  int *array;
  array = getNumbers(arraySize); //getNumbers should return a pointer
  //Print out original array
  cout << "Original array" << endl;
  for (int count = 0; count < arraySize; count++) {
    cout << *(array + count) << " ";
  }
  //Sort array using the swap function
  //Have a for loop to swap numbers one by one from min to max
  //Compare values using a second for loop
  //Swap values if former value is larger
  //swap(&array[i],&array[j]);
  for (int i = 0; i < arraySize; i++) {
    for (int j = 0; j < (arraySize - 1); j++) {
      if (array[j] > array[j + 1]) {
        /*********** This line was changed ***********/
        swap(&array[j+1], &array[j]); // You were earlier swapping ith and jth entries.
        /*********************************************/
      }
    }
  }
  //Print out sorted array
  cout << "\nSorted Array" << endl;
  for (int count = 0; count < arraySize; count++) {
    cout << *(array + count) << " ";
  }
  return 0;
}

void swap(int *num1, int *num2) {
  //Keep record of original value of num1
  int tempNum;
  tempNum = *num1;
  *num1 = *num2;  //num1 value has been changed
  *num2 = tempNum;    //Fetch the original value of num1 and assign it to num2
}

int *getNumbers(int size) {
  int *array;

  array = new int[size];

  srand(time(0));

  for (int i = 0; i < size; i++) {
    array[i] = rand() % 100;
  }
  return array;
}

You were swapping array[i] with array[j] in line 32. array[j] and array[j+1] should be swapped. Also, as pointed out by dd2, your loop bounds are not strict. The code would work correctly nonetheless but would take more steps. You can change the bound to j < (arraySize - i - 1)

Upvotes: 3

v78
v78

Reputation: 2933

Your loop bounds are not correct and swapping was wrong as well.

for(int i = 0; i < arraySize; i++)
{
    for(int j = 0; j < (arraySize - i - 1); j++)
    {
        if(array[j] > array[j + 1])
        {
            swap(&array[j], &array[j+1]);
        }
    }
}

Upvotes: 3

Related Questions