"bubble sort algorithm"小错误

The "bubble sort algorithm" small error

本文关键字:错误 sort bubble algorithm      更新时间:2023-10-16

我被给予了:

"编写一个实现整数数组的气泡排序的函数。该函数的原型如下:void sort(int data [],int count);

编写一个提示文件名的程序,打开该文件并将数字从文件中读取到数组。然后,您的程序应调用您的排序例程,然后打印结果数组。"

我完成了它,它的工作正常,直到我被告知数字已经按秩序的情况下也必须尽早停止。您将在下面的void函数中看到这种尝试。我没有遇到任何错误;该程序编译,执行并关闭良好。现在的问题是添加了布尔变量,它不再分类数字。它将以与文本文件相同的顺序打印出它们。我通过调试器进行了运行,并注意到" II"变量并没有像应该(...; ...; ii )那样增加1个通行证,而是保持0。任何想法?<<

" integers.txt"文件中的(随机)数字:12 42 5 67 41 9 19 93 10 124 21

void sort(int data[], int count);
int main()
{
    const int MAX_SIZE = 128;
    char fileName[MAX_SIZE];
    int data[MAX_SIZE];
    int count = 0;
    cout << "Enter a file name: "; //integers.txt
    cin.clear();
    cin.ignore(cin.rdbuf()->in_avail());
    cin.getline(fileName, sizeof(fileName));
    ifstream input(fileName); //opens the file and reads the first line
    if (input.is_open())
    {
        while (!input.eof() && count <= MAX_SIZE) //adds data to the array until the end of the file is reached
        {
            input >> data[count];
            count += 1;
        }
    input.close();
    }
    else
    {
        cout << "nThe file failed to open, try again.n";
    }
    sort(data, count); //calls the bubble sort function
    return 0;
}
void sort(int data[], int count)
{
    int temp = 0;
    int pass = 0;
    bool sorted = false;
    for (int pass = 0; pass <= count; pass += 1) //counts the number of passes
    {
        for (int ii = 0; (ii <= (count - pass - 1)) && (sorted = false) ; ii++) //sorts the integers from least to greatest
        {                                                                       //also 'supposed to' stop early if already sorted
            if (data[ii] > data[ii + 1])
            {
                sorted = false;
                temp = data[ii];
                data[ii] = data[ii + 1];
                data[ii + 1] = temp;
            }
        } 
    }
    cout << "nSorted integers: ";
    for (int jj = 1; jj <= count; jj += 1) //prints the sorted integers
    {
        cout << data[jj] << " ";
    }
    cout << "nn";
}

您想在外循环中进行sorted检查。那就是:

for (int pass = 0; pass < count && !sorted; pass += 1) //counts the number of passes
{
    sorted = true;
    for (int ii = 0; ii < (count - pass); ii++) //sorts the integers from least to greatest
    {

这里的想法是,在每个通行证的开头,您假设数组是对的。如果进行交换,则可能不会对数组进行排序,因此将标志设置为false。只有当您在没有任何交流的情况下进行整个通行证时,标志才会是正确的。

另外,请注意,我将您的外循环比较更改为pass < count而不是pass <= count。请记住,当您从0开始时,极限为 count-1

我还将内部循环条件从<= (count - pass - 1)更改为< (count - pass)。它们等效,但后者更简洁。