Magnahawk Magnahawk - 2 months ago 17
C++ Question

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;
}

Answer

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)