注册 登录
编程论坛 C++教室

拆入排序法为啥第一个总是不换位置

叶纤 发布于 2020-01-31 23:51, 1626 次点击
输入56,4 ,6 ,34 ,6 ,8 ,5 ,67 ,5 ,4
结果数组的第一位总是不变,为啥吗
56
4
4
5
5
6
6
8
34
67


Running Time:166ms

#include<stdio.h>
#include<time.h>   //用到clock()函数
#include<iostream>
int main() {
    int begintime,endtime;
    begintime=clock();  //计时开始
   
int a[10]= {56,4 ,6 ,34 ,6 ,8 ,5 ,67 ,5 ,4};
   // for(int i=0; i<10; ++i)
    //{   std::cin>>a[i];
   // }
    for(int j=2; j<10; ++j)
    {    int tem=a[j];int i=0;
        for(i=j-1; i>0&&a[i]>tem; --i)
        {   //int tem=a[i+1];
            a[i+1]=a[i];
            //a[i]=tem;  
         }
         a[i+1]=tem;
        
    }
    for(int i=0; i<10; ++i)
    { std::cout<<a[i]<<std::endl;
    }

    endtime = clock();  //计时结束
    printf("\n\nRunning Time:%dms\n", endtime-begintime);
    return 0;
}
6 回复
#2
林月儿2020-02-01 06:55
int main() {
    int begintime,endtime;
    begintime=clock();  //计时开始
   
int a[10]= {56,4 ,6 ,34 ,6 ,8 ,5 ,67 ,5 ,4};
   // for(int i=0; i<10; ++i)
    //{   std::cin>>a[i];
   // }
    for(int j=2; j<10; ++j)
    {    int tem=a[j];int i=0;
        for(i=j-1; i>0&&a[i]>tem; --i)
        {   //int tem=a[i+1];
            a[i+1]=a[i];
            //a[i]=tem;  
         }
         a[i+1]=tem;
        
    }
    for(int i=0; i<10; ++i)
    { std::cout<<a[i]<<std::endl;
    }

    endtime = clock();  //计时结束
    printf("\n\nRunning Time:%dms\n", endtime-begintime);
    return 0;

代码不加行标没法看
内循环里面有i>0的判断,所以首位不访问,其次i在内循环被赋值j-1
所以上面的i=0就没用了
代码缩进,空格不规范,上传无行标不方便分析
#3
林月儿2020-02-01 07:06
这个排序在实际开发工作中,一般只是补充一下排序的规则
具体的实现由库函数自己实现,建议先走马观花把其他的数据结构,算法了解一下再回过头看看感兴趣的
深入研究一下
#4
纯蓝之刃2020-02-01 07:33
程序代码:
#include<stdio.h>
#include<time.h>   //用到clock()函数
#include<iostream>

int main()
{
    int begintime,endtime;
    begintime=clock();  //计时开始

    int a[10]= {56,4 ,6 ,34 ,6 ,8 ,5 ,67 ,5 ,4};
   // for(int i=0; i<10; ++i)
   
//{   std::cin>>a[i];
   
// }
    for(int j=1; j<10; ++j)         //这里
    {
        int tem=a[j],i=0;
        for(i=j-1; i>=0&&a[i]>tem; --i) //这里
        {   //int tem=a[i+1];
            a[i+1]=a[i];
            //a[i]=tem;
         }
         a[i+1]=tem;

    }
    for(int i=0; i<10; ++i)
    {
        std::cout<<a[i]<<std::endl;
    }

    endtime = clock();  //计时结束
    printf("\n\nRunning Time:%dms\n", endtime-begintime);
    return 0;
}
#5
叶纤2020-02-01 12:14
感谢大佬们,理解了,j可以等于0、1,但一定不要等于大于等于2的,如果等于2则第0位永远排序不到
#6
雪影辰风2020-02-01 13:26
有关细节问题你需要多注意一下,还有,如果你是做OI的话,我推荐你把所有的排序方法都了解一下,大概六七种
#7
叶纤2020-02-01 13:32
回复 6楼 雪影辰风
感谢
1