注册 登录
编程论坛 C语言论坛

请大佬给看看这个插入排序的代码对吗 谢谢

天下天下 发布于 2020-04-07 16:25, 3391 次点击
#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 ;
}
11 回复
#2
叶纤2020-04-07 16:38
只有本站会员才能查看附件,请 登录

你先对照着伪代码敲一遍
你这个第一个必须最小,大了就错
#3
天下天下2020-04-07 16:42
回复 2楼 叶纤
谢谢大佬 这个是我自己根据原理写的  没看源代码  这样写对吗
#4
叶纤2020-04-07 16:52
程序代码:
            这个是我根据伪代码逻辑分析出一个易读的代码      
#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 ;
}



#5
叶纤2020-04-07 17:09
程序代码:
    #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 ;
}        
#6
lin51616782020-04-07 17:17
以下是引用叶纤在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 ;
}        

三层循环 怎么想也不合理啊
#7
叶纤2020-04-07 17:22
以下是引用lin5161678在2020-4-7 17:17:12的发言:


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

 这个你要问楼主了,问我?我也答不出来
#8
叶纤2020-04-07 17:23
我的代码在4楼,欢迎找茬
#9
wmf20142020-04-07 18:30
排序结果正确,但不是插入排序,第三层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;
            }
....
#10
lin51616782020-04-07 20:44
以下是引用叶纤在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;
}
#11
return_02020-04-07 21:23
+-----====-----+
|
只有本站会员才能查看附件,请 登录
|
+-----====-----+
#12
叶纤2020-04-07 22:43
回复 10楼 lin5161678
翻了翻我之前写的代码,缩进上的问题确实是我的一大痛点,相对于我前两个月刚学习的时候我的代码更是丑陋的可以认丑陋妈妈了,
因为代码缩进上比较丑陋,导致排版也比较丑陋,还好有个光明使者提出了最严重的排版问题,醒悟了之后就知道括号对着括号了,
代码缩进问题上我一直在改进,感谢大大提醒,因为现在是小白阶段,我关注代码的可读性性比代码的美观性要多一些,
https://bbs.bccn.net/thread-498184-1-1.html

https://bbs.bccn.net/thread-498253-1-1.html
相对于我刚接触c++的时候和现在还是有点进步的
1