Demons_614 2022-04-03 18:20 采纳率: 100%
浏览 18
已结题

算法排序之插入排序找问题

数组的数据换成{12,73,45,69,35}这组数据或者{5,4,3,2,1}这组数据可以成功从小到大排序,但就是换成{17,11,20,3,6}这组数据时,排不了序,输出的为11 11 20 3 6;就很好奇为什么,代码什么的都没有改过

#include<iostream>
using namespace std;
int main()
{//从小到大排序 
    int n,t,k;
//    int a[5]={12,73,45,69,35};//这组可以成功排序 
    int a[5]={17,11,20,3,6}; //这组不能成功排序 
//    int a[5]={5,4,3,2,1}; //这组可以成功排序 
    
    for(int i=1;i<5;i++)//无序区 
    {
        t=a[i];//取出无序区中的第一个数和有序区中比较
        for(int j=i-1;j>=0;j--)//有序区,将数组中的第一个数默认为有序区的数 
        {
            if(t>a[j])
            {
            //由于无序区的数比有序区的数大,那么直接退出循环
                k=j+1;
                break; 
//            有序区已经有了顺序,即判断当前无序区的数大于,则无序区的数不需要再和前面的有序数作比较 
            } 
            else
            {
                a[j+1]=a[j];
            }
        } 
//        将无序数比较好,找到位置了之后放进去 
        a[k]=t;
    }
    for(int i=0;i<5;i++)
    {
        cout<<a[i]<<" ";
    } 
} 

img


490020189846121.png _

img

img

  • 写回答

1条回答 默认 最新

  • ash062 2022-04-04 13:39
    关注

    只分析未正确排序的这次,不妨在每次修改后打印数组元素,然后就可以发现是在i = 3时的插入有问题,k未被正确赋值,仍为上一轮循环值,因此出错

    #include<iostream>
    using namespace std;
    int main()
    {//从小到大排序 
        int n = 0, t = 0, k = 0;
        //int a[5]={12,73,45,69,35};//这组可以成功排序 
        int a[5] = { 17,11,20,3,6 }; //这组不能成功排序 
        //int a[5]={5,4,3,2,1}; //这组可以成功排序 
    
        for (int i = 1; i < 5; i++)//无序区 
        {
            t = a[i];//取出无序区中的第一个数和有序区中比较
            for (int j = i - 1; j >= 0; j--)//有序区,将数组中的第一个数默认为有序区的数 
            {
                // k = j;
                if (t > a[j])
                {
                    //由于无序区的数比有序区的数大,那么直接退出循环
                    k = j + 1;
                    break;
                    //            有序区已经有了顺序,即判断当前无序区的数大于,则无序区的数不需要再和前面的有序数作比较 
                }
                else
                {
                    a[j + 1] = a[j];
                    for (int i = 0; i < 5; i++)
                    {
                        cout << a[i] << " ";
                    }
                    cout << "\n\n";
                }
            }
            //        将无序数比较好,找到位置了之后放进去 
            a[k] = t;
            for (int i = 0; i < 5; i++)
            {
                cout << a[i] << " ";
            }
            cout << "\n\n";
        }
        for (int i = 0; i < 5; i++)
        {
            cout << a[i] << " ";
        }
    }
    

    然后可能因为编译器问题,我这边跑出来的结果还有些不一样

    img

    可通过在内循环首行赋值k = j解决该问题

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 4月28日
  • 已采纳回答 4月20日
  • 创建了问题 4月3日

悬赏问题

  • ¥15 AT89C51控制8位八段数码管显示时钟。
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口