在《用C++编程入门》第6版书中,它解释了用C++进行冒泡排序的算法,并且我理解它,但是有两行代码我不明白为什么它们会出现在代码中,当我试图理解代码时我会擦除它们并没有任何改变,算法仍然有效。
所以我仍然对他们感到困惑。
有代码;

int main()
 {
     int numbers[4] = {23, 46, 12, 35};
     int sub = 0; //keeps track of subscripts
     int temp = 0; //variable used for swapping
     int maxSub = 3; //maximum subscript
     int lastSwap = 0; //position of last swap
     char swap = 'Y'; //indicates if a swap was made

     //repeat loop instructions as long as a swap was made
     while (swap == 'Y')
     {
     swap = 'N'; //assume no swaps are necessary

     sub = 0; //begin comparing with first
     //array element

     //compare adjacent array elements to determine
     //compare adjacent array elements to determine
     //whether a swap is necessary
     while (sub < maxSub)
     {
         if (numbers[sub] > numbers[sub + 1])
         {
             //a swap is necessary
             temp = numbers[sub];
             numbers[sub] = numbers[sub + 1];
             numbers[sub + 1] = temp;
             swap = 'Y';
             lastSwap = sub;
         } //end if
         sub += 1; //increment subscript
         } //end while

         maxSub = lastSwap; //reset maximum subscript
     } //end while

     //display sorted array
     for (int x = 0; x < 4; x += 1)
        cout << numbers[x] << endl;
     //end for

     system("pause");
     return 0;
 } //end of main function
所以我不明白lastSwap = submaxSub = lastSwap
它们重要吗?还是我想从代码中删除它们是正确的?
谁能向我解释。

最佳答案

为简单起见,
泡沫排序=>数组中的最大元素的第一遍获得新的适当位置。
第二遍=>数组中的第二个最大元素获得新的适当位置。



第N个传递=>数组中的第N个元素将获得新的适当位置。
变量lastSwap存储最后一次交换发生的数组的最大索引。
现在,如果对于第一遍,新的合适位置不是数组的最后一个索引,即lastSwap < last index of array,则意味着索引lastSwap之后的数组已经排序,因此我们不需要对其进行处理。
每个通行证都遵循此规则,并且通行证总数(maxSub)的上限设置为lastSwap,从而减少了通行证的数量。
使用这两行的优点:

  • 我们优化了在所有遍完成之前对数组进行排序时的遍数。
  • 它也可以在第一遍中检测给定的/输入数组是否已排序。
  • 07-24 14:15