乔治爱啃脚趾 发表于 2023-12-13 20:47:32

冒泡排序

为什么这个冒泡排序不成功
void Bubble_sort(SqList &L1,int n)
{
        int i,j,temp;
        bool change=true;
        L1.r = (RedType*)malloc(sizeof(RedType) * MAXSIZE);
        L1.length=1;
        for(i=1;i<=n;i++)
        {
                scanf("%d",&L1.r.key);
                L1.length++;
        }
        for(i=1;i<L1.length;i++){
                change=false;
                for(j=1;j<L1.length-i;j++)
                {
                        if(L1.r.key>L1.r.key)
                        {
                                temp=L1.r.key;
                                L1.r.key=L1.r.key;
                                L1.r.key=temp;
                                change=true;
                                cm.mvn++;
                        }
                }
        }
        printf("排序后的数据序列为:");
        for(i=1;i<L1.length;i++){
                printf("%d ",L1.r.key);
        }
        printf("\n比较次数:%d\n", cm.cpn);
    printf("移动次数:%d\n", cm.mvn);               
}

FishC 发表于 2023-12-13 20:47:55

冒泡排序是一种简单的排序算法,它重复地遍历要排序的序列,一次比较两个相邻的元素,并且交换他们的位置,如果他们的顺序错误就交换。直到没有再需要交换的元素,排序完成。

在你提供的代码中,有几个问题会导致冒泡排序不成功:

1. L1.r的初始化:你将L1.r指向了一个动态分配的内存空间,但没有为其赋值。

2. L1.length的初始化:你将L1.length初始化为了1,但实际上应该是n。

3. 排序结束的条件:你使用了一个change变量来判断是否还需要继续排序,但你并没有在排序发生交换时将change设置为true,导致无法正确判断排序是否完成。

下面是修正过的代码:

++
void Bubble_sort(SqList &L1,int n)
{
    int i,j,temp;
    bool change=true;
    L1.r = (RedType*)malloc(sizeof(RedType) * n); // 分配n个元素大小的内存空间
    L1.length=n; // 设置序列长度为n
    for(i=1;i<n && change;i++) // 修改循环条件
    {
      change=false; // 初始化change为false
      for(j=0;j<n-i;j++)
      {
            if(L1.r.key > L1.r.key)
            {
                temp = L1.r;
                L1.r = L1.r;
                L1.r = temp;
                change=true; // 发生交换时将change设置为true
            }
      }
    }
}

这样修改之后,冒泡排序应该就能够顺利执行了。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 冒泡排序