怎样修改程序可以减少比较次数

img


程序中每一趟都要将两两相邻元素比较九次,实际上最大元素沉底后,第二趟可以不用比较它,怎样修改程序可以减少比较次数。

该回答引用ChatGPT

在冒泡排序中,每一趟比较之后,数组的最大元素都会移动到最后的位置。所以在后续的趟比较中,最大元素之后的元素就不需要再比较了。
可以这样修改程序:

#include "stdio.h"

void main() 
{
    int i,j;
    int array[10] = {16,32,20,7,16,25,34,3,22,1}; 
    int temp;
    
    printf("\nThe original array is:\n");
    for(i=0;i<10;i++)
        printf("%d",array[i]);
    
    for(i=0;i<9;i++) 
    {
        for(j=0;j<9-i;j++) //修改的地方
            if(array[j]>array[j+1]) 
            {
                temp = array[j];
                array[j] = array[j+1];
                array[j+1] = temp;
            }  
    }  
    
    printf("\nThe sorted array is: \n");
    for(i=0;i<10;i++)
        printf("%d",array[i]);
}

主要的修改是:
内层for循环的循环变量j的范围修改为0到9-i。
因为外层for循环的变量i表示排序趟数,每一趟排序后,数组的最后i个元素是已排序的状态,不需要再比较。所以内层比较的范围可以减少为前9-i个元素。
这个修改使得比较次数从原来的9x9=81次减少为9+8+7+...+1=45次。效率有了较大提高。
这个改进思路对于任何排序算法来说都适用。通过减少已排序元素的比较次数,可以提高排序效率。

这不是标准冒泡排序吗
你不能先看看书上是怎么写的,一定要自己搞吗