| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2906 人关注过本帖
标题:请大佬给看看这个插入排序的代码对吗 谢谢
只看楼主 加入收藏
天下天下
Rank: 2
等 级:论坛游民
帖 子:62
专家分:15
注 册:2013-10-14
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:11 
请大佬给看看这个插入排序的代码对吗 谢谢
#include<stdio.h>

int main(void)
{
    int a[] = {13,36,51,98,33,969,57,82,31};
    int i , j , tem ;
   
    for(i = 0 ; i<sizeof(a)/sizeof(int)-1 ; i++)
    {
        for(j = i+1 ; j<sizeof(a)/sizeof(int) ; j++)
        {
            int n = 0 ,k = i , m =j ;
            for(n ; a[k]>a[m] ; k--,m--)  
            {
                tem = a[m] ;
                a[m] = a[k] ;
                a[k] = tem ;
            }
        }  
    }
   
    for(i = 0 ; i<sizeof(a)/sizeof(int) ; i++)
    {
        printf("%d ",a[i]);
    }
    return 0 ;
}
搜索更多相关主题的帖子: 插入 int for 排序 sizeof 
2020-04-07 16:25
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
收藏
得分:5 
图片附件: 游客没有浏览图片的权限,请 登录注册

你先对照着伪代码敲一遍
你这个第一个必须最小,大了就错

把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-04-07 16:38
天下天下
Rank: 2
等 级:论坛游民
帖 子:62
专家分:15
注 册:2013-10-14
收藏
得分:0 
回复 2楼 叶纤
谢谢大佬 这个是我自己根据原理写的  没看源代码  这样写对吗
2020-04-07 16:42
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
收藏
得分:0 
程序代码:
            这个是我根据伪代码逻辑分析出一个易读的代码      
#include<stdio.h>

int main(void)
{
    int a[] = {301,346,518,98,33,969,57,82,3};
    
   
    for(int i = 1 ; i<sizeof(a)/sizeof(int) ; ++i)
    {
        for(int j = i-1,tem=0 ;(j>=0)&&a[j]>a[j+1]  ; --j)
        {   tem=a[j];
       a[j] =a[j+1] ;
       a[j+1]=tem;
        }
           
    }
   
    for(int i = 0 ; i<sizeof(a)/sizeof(int) ; i++)
    {
        printf("%d ",a[i]);
    }
    return 0 ;
}




把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-04-07 16:52
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
收藏
得分:0 
程序代码:
    #include<stdio.h>
int main(void)
{
    int a[] = {133,316,51,98,33,969,57,82,1};
    int i , j , tem ;
   
    for(i = 0 ; i<sizeof(a)/sizeof(int)-1 ; i++)
    {
        for(j = i+1 ; j<sizeof(a)/sizeof(int) ; j++)
        {    int k = i , m =j ;
            for(int n = 0 ;k>=0&& a[k]>a[m] ; k--)  
            {
                tem = a[m] ;
                a[m] = a[k] ;
                a[k] = tem ;
            }
        }  
    }
   
    for(i = 0 ; i<sizeof(a)/sizeof(int) ; i++)
    {
        printf("%d ",a[i]);
    }
    return 0 ;
}        

把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-04-07 17:09
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:5 
以下是引用叶纤在2020-4-7 17:09:08的发言:

    #include<stdio.h>
int main(void)
{
    int a[] = {133,316,51,98,33,969,57,82,1};
    int i , j , tem ;
   
    for(i = 0 ; i<sizeof(a)/sizeof(int)-1 ; i++)
    {
        for(j = i+1 ; j<sizeof(a)/sizeof(int) ; j++)
        {    int k = i , m =j ;
            for(int n = 0 ;k>=0&& a[k]>a[m] ; k--)  
            {
                tem = a[m] ;
                a[m] = a[k] ;
                a[k] = tem ;
            }
        }  
    }
   
    for(i = 0 ; i<sizeof(a)/sizeof(int) ; i++)
    {
        printf("%d ",a);
    }
    return 0 ;
}        

三层循环 怎么想也不合理啊

https://zh.
2020-04-07 17:17
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
收藏
得分:0 
以下是引用lin5161678在2020-4-7 17:17:12的发言:


三层循环 怎么想也不合理啊

 这个你要问楼主了,问我?我也答不出来

把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-04-07 17:22
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
收藏
得分:0 
我的代码在4楼,欢迎找茬

把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-04-07 17:23
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:5 
排序结果正确,但不是插入排序,第三层for循环基本不循环,只是让a[i]和a[j]比较,如果a[i]>a[j]就交换,j循环一次,最终让最小的数放到最前面,这是典型的选择排序,和选择排序稍微不一样的是,选择排序是记录下标,最后再交换,你的是及时交换,另外,你定义的变量n毫无作用,你可以试试将第三层循环改成if判断,就会发现排序结果也是对的,如下:
....
//            for (n; a[k] > a[m]; k--, m--)   //for注释掉,改成下句if,最后也能排序
            if(a[k]>a[m])
            {
                tem = a[m];
                a[m] = a[k];
                a[k] = tem;
            }
....

能编个毛线衣吗?
2020-04-07 18:30
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:0 
以下是引用叶纤在2020-4-7 17:23:31的发言:

我的代码在4楼,欢迎找茬

4楼的代码 除了缩进很糟糕 其他的倒什么了
这个交换看着繁琐
其实不用这样操作
把要排序的数据存起来
每一个需要后移的元素直接后移
然后把存起来的元素插入到指定位置

就能实现截图的效果
算是一个小小的改进吧
程序代码:
#include <stdio.h>
int main()
{
    int a[] = {301,346,518,98,33,969,57,82,3};
    
    for(int i = 1; i < sizeof a/sizeof *a; ++i)
    {
        int tmp = a[i]; //保存准备插入的元素 
        
        int pos = i-1;
        while(pos >= 0 && a[pos] > tmp)//后移操作 空出插入位置 
        {
            a[pos + 1] = a[pos];
            --pos; 
        }
            
        a[pos + 1] = tmp;//插入操作 
    }
    
    for(int i = 0; i < sizeof a/sizeof *a; ++i) 
        printf("%4d",a[i]);
    puts("");
    return 0;
}

https://zh.
2020-04-07 20:44
快速回复:请大佬给看看这个插入排序的代码对吗 谢谢
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.055148 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved