鱼C论坛

 找回密码
 立即注册
查看: 2981|回复: 9

[已解决]关于排序的问题

[复制链接]
发表于 2022-11-10 11:05:11 | 显示全部楼层 |阅读模式
3鱼币
我这个程序是把数组a中的整形重新按照从小到大的顺序排序,感觉自己想法没错,但是好像实现不了
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i, num, j, k;
    int a[15] = {50, 35, 45, 69, 12, 7896, 32, 45, 1, 0, 945, 3, 45, 78, 21};
    int *aa = a;
    for (int i = 1; i <= 15; i++)
    {
        if (aa[i] < aa[i - 1])
        {
            num = aa[i];
            for (j = i - 1; (j >= 0) && (aa[j] > num); --j)
                aa[j + 1] = aa[j];
            aa[j] = num;
        }
    }
    for (k = 0; k < 15; k++)
    {
        printf("%d,", aa[k]);
    }

    putchar('\n');
    system("pause");
    return 0;
}
最佳答案
2022-11-10 11:05:12
本帖最后由 jackz007 于 2022-11-10 12:39 编辑
#include <stdio.h>
#include <stdlib.h>

int main()
{
        int c , i , num , j , k                                                  ;
        int a[15] = {50, 35, 45, 69, 12, 7896, 32, 45, 1, 0, 945, 3, 45, 78, 21} ;
        for(i = 0 , c = 1 ; i < 15 && c ; i ++)
        {
                for(c = 0 , j = 1 ; j < 15 - i ; j ++)
                {
                        if(a[j] < a[j - 1])
                        {
                                k = a[j - 1]             ;
                                a[j - 1] = a[j]          ;
                                a[j] = k                 ;
                                c ++                     ;
                        }
                }
        }
        printf("%d" , a[0])                              ;
        for(i = 1 ; i < 15 ; i ++) printf(", %d" , a[i]) ;
        printf("\n")                                     ;
        system("pause")                                  ;
}
uTools_1668049547452.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-10 11:05:12 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-11-10 12:39 编辑
#include <stdio.h>
#include <stdlib.h>

int main()
{
        int c , i , num , j , k                                                  ;
        int a[15] = {50, 35, 45, 69, 12, 7896, 32, 45, 1, 0, 945, 3, 45, 78, 21} ;
        for(i = 0 , c = 1 ; i < 15 && c ; i ++)
        {
                for(c = 0 , j = 1 ; j < 15 - i ; j ++)
                {
                        if(a[j] < a[j - 1])
                        {
                                k = a[j - 1]             ;
                                a[j - 1] = a[j]          ;
                                a[j] = k                 ;
                                c ++                     ;
                        }
                }
        }
        printf("%d" , a[0])                              ;
        for(i = 1 ; i < 15 ; i ++) printf(", %d" , a[i]) ;
        printf("\n")                                     ;
        system("pause")                                  ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-10 11:31:32 | 显示全部楼层
本帖最后由 jhq999 于 2022-11-10 11:40 编辑

aa[j+1] = num;//因为都是以循环条件为否结束的,aa[j]>num为假时,aa[j]<=num,aa[j+1]才是最后一个大于num的

评分

参与人数 1荣誉 +2 鱼币 +5 贡献 +2 收起 理由
1613551 + 2 + 5 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-10 11:47:51 | 显示全部楼层
for (int i = 1; i <= 15; i++)
    {
        if (aa[i] < aa[i - 1])      //11行这里有个越界的问题,aa[15]是不能用的
for (j = i - 1; (j >= 0) && (aa[j] > num); --j)
                aa[j + 1] = aa[j];  // 第15行,这里原来aa[j +1]的数据丢失了,导致了你结果里出现了一大堆的50
            aa[j] = num;
        }

评分

参与人数 1荣誉 +2 鱼币 +5 贡献 +2 收起 理由
1613551 + 2 + 5 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-11-10 12:15:06 | 显示全部楼层
好难还是没有想明白,晚上再想了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-11-10 14:44:47 | 显示全部楼层

大佬,我主要是想理解教材上的案例
uTools_1668062608158.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-10 14:51:26 | 显示全部楼层
本帖最后由 jackz007 于 2022-11-10 14:52 编辑
1613551 发表于 2022-11-10 14:44
大佬,我主要是想理解教材上的案例


        条条道路通罗马,对于编程而言,绝对是结果主导一切。只要结果对,说啥都有理!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-10 15:22:18 | 显示全部楼层
题目的注释还是很清楚的,问题如下
9行    for (int i = 1; i <= 15; i++)      这里是想遍历a[1]-a[14]的数据,不能越界,改成i < 15
16行  改成aa[j+1] = num;       前面的for结束时,j又完成了一次 j--, 要用原来的位置,那就 j + 1

评分

参与人数 1荣誉 +2 鱼币 +5 贡献 +2 收起 理由
1613551 + 2 + 5 + 2 懂了谢谢

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-11-10 18:19:24 | 显示全部楼层
jackz007 发表于 2022-11-10 14:51
条条道路通罗马,对于编程而言,绝对是结果主导一切。只要结果对,说啥都有理!

懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-11-10 18:25:53 | 显示全部楼层
两手空空儿 发表于 2022-11-10 15:22
题目的注释还是很清楚的,问题如下
9行    for (int i = 1; i

我怀疑我是一个智障....我一直不理解的原因是,第14的for语句,我忘记加{}号了......我一直没注意到,我说怎么怎么想都想明白呢......因为我自己脑部了括号了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 08:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表