挺烦的 2024-01-27 19:57 采纳率: 100%
浏览 7
已结题

关于#c语言#的问题:开始使用加减法交换两个数,后来使用临时变量交换两个数(相关搜索:选择排序)

写了一个选择排序函数,开始使用加减法交换两个数,但是排序结果最后两个数变成了0,后来使用临时变量交换两个数,排序结果是正确的。为什么使用加减法交换两个数的结果会是错的?是加减法交换两个数有什么bug吗?

void Select_Sort(int *arr,int length)
{
    int max;
     for (int i = 0; i < length-1; i++) {
        max=0;
        for (int j = 1; j < length-i; j++) {
            if (arr[j] > arr[max]) {
                max=j;
            }
        }
        // int temp=arr[max];
        // arr[max]=arr[length-1-i];
        // arr[length-1-i]=temp;
        arr[max]=arr[max]+arr[length-1-i];
        arr[length-1-i]=arr[max]-arr[length-1-i];
        arr[max]=arr[max]-arr[length-1-i];
    }
}
int main()
{
    int arr[6]={2,34,1,0,65,90};
    Select_Sort(arr,6);
    for(int i=0;i<6;i++)
        printf("%d ",arr[i]);

    return 0;
}

img


第一个是加减法交换得到的结果,第二个是使用temp临时变量交换得到的结果

  • 写回答

3条回答 默认 最新

  • a5156520 2024-01-27 20:29
    关注

    上面贴出来的代码,主要是一些交换数据那里需要修改下。

    修改如下:

    参考链接:
    https://www.cnblogs.com/fanrenyh/p/6704548.html

    #include <stdio.h> 
    
    void Select_Sort(int *arr,int length)
    {
        int max;
         for (int i = 0; i < length-1; i++) {
             
            max=i; // 这里默认下标为i的位置的数为当前最大的值 
            for (int j = i+1; j < length; j++) {
                if (arr[j] > arr[max]) {
                    max=j;
                }
            }
            
           
            // int temp=arr[max];
            // arr[max]=arr[length-1-i];
            // arr[length-1-i]=temp;
            
            // https://www.cnblogs.com/fanrenyh/p/6704548.html
            if(max!=i){  // 如果比较出的最大值不是下标i位置的值,则使用加减法交换下标i位置的元素值和下标max位置的元素值 
                arr[max]=arr[max]+arr[i];
                arr[i]=arr[max]-arr[i];
                arr[max]=arr[max]-arr[i];
            }
        }
    }
    int main()
    {
        int arr[6]={2,34,1,0,65,90};
        Select_Sort(arr,6);
        for(int i=0;i<6;i++)
            printf("%d ",arr[i]);
     
        return 0;
    }
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 2月6日
  • 已采纳回答 1月29日
  • 创建了问题 1月27日

悬赏问题

  • ¥40 微信小程序 使用vant组件ActionSheet 下拉面板,内容区域滚动会触发。scroll-view自定义下拉刷!即使设置停止下拉刷新也不行。
  • ¥15 专业问题提问,7月5号2点之前
  • ¥25 使用cube ai 导入onnx模型时报错
  • ¥15 关于#微信小程序#的问题:用一个网页显示所有关联的微信小程序数据,包括每个小程序的用户访问量
  • ¥15 root的安卓12系统上,如何使apk获得root或者高级别的系统权限?
  • ¥20 关于#matlab#的问题:如果用MATLAB函数delayseq可以对分数延时,但是延时后波形较原波形有幅度上的改变
  • ¥15 使用华为ENSP软件模拟实现该实验拓扑
  • ¥15 通过程序读取主板上报税口的数据
  • ¥15 matlab修改为并行
  • ¥15 尝试访问%1服务的windows注册表时遇到问题。必须先解决此问题,然后才能运行安装过程。(请确认您正在使用管理员权限运行)373