使用交换函数和指针进行C ++冒泡排序

时间:2016-10-07 05:50:20

标签: c++ arrays sorting

我在弄清楚冒泡排序代码出错的地方时遇到了问题。我几乎肯定它在排序算法中。以下是我需要完成的代码:

- 初始化一个数组,用随机数填充它(我用getNumbers()来完成这个)

- 将第一个元素与后面的所有元素进行比较。如果第一个元素较大,则交换它们。

- 将第二个元素与所有后面的元素逐个进行比较。如果第二个元素较大,则交换它们。

- 继续比较和交换操作,直到倒数第二个元素。

- 打印出已排序的数组

这是我的代码:

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

2 个答案:

答案 0 :(得分:3)

这是正确的代码。

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

您在第32行与array[i]交换array[j]array[j]array[j+1]应该互换。另外,正如dd2所指出的,你的循环边界并不严格。代码可以正常工作,但会采取更多步骤。您可以将绑定更改为j < (arraySize - i - 1)

答案 1 :(得分:3)

你的循环边界不正确,交换错误。

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