c题目14:写成一个函数,对数组进行排序

每日小语

一个人倘若需要从思想中得到快乐,那么他的第一个欲望就是学习。——王小波

 自己思考

这不前几天刚搞的东西吗,就写成一个函数,这个有什么难的吗?我有时候那个分别心特重啊,真就别人拿到个啥好的比杀了我还难受,没关系,我承认我贱,我接受好吧,谁让我是个人呢。

之前提到是冒泡排序对吧,就是比较比较比较,然后chua比出来一个最大的,把它提前,后面的删了,然后再从删了的里面继续比较,就酱。写的时候吧,我脑袋里有好多问题,就我要输入一个数组,

那这个数组我该怎么计算有几个元素在里面呢?因为我需要它的切片索引来进行我的大业啊

然后呢我就想到strlen()但是吧,这个东西呢就我输入的这个东西我定义的是str,就连逗号都会算进去,呜呜呜。

所以当务之急就是明白c语言如何弄数组

int arr[5] = {1, 2, 3, 4, 5};
int i;

for (i = 0; i < 5; i++) {
    printf("arr[%d] = %d\n", i, arr[i]);
}

就gpt告诉我是这样,然后我就有了一点思路,emmmm,就是一点点对吧,刚刚脑袋里产生了一个新的想法,就是循环把它一个个填到这个空数组里。

写着写着我发现还需要一个计数器。

 又是这个离谱的问题,上次有个小同学用魔法帮我解决了,再次看到不禁感叹我还是不会。

第12行出现了两个错误:

  1. ij的定义:在代码的开头,使用了int i, j;来声明ij,但此时ij还没有被初始化,因此无法用它们来声明数组。你应该在读取num定义array数组,并使用正确的大小。

  2. 数组作为参数传递:在sort函数的参数中,你使用了array作为函数的参数,但在使用时没有指定数组的大小。你可以将数组大小作为另一个参数传递给sort函数,或者在代码中使用全局变量来定义数组的大小。

  3. 还有就是交换数字的时候设置了一个中间变量,我也搞不懂。在代码段p = array[j]; array[j] = array[i]; array[i] = p;中,通过引入临时变量p,我们可以在不丢失原始值的情况下交换两个

    //排序
    #include <stdio.h>
    int sort(int array[], int num)//要声明类型
    {
        for(int i=0;i<num;i++)
        {
            for(int j=i+1;j<num;j++)
            {
                int p;
                if(array[i]>array[j])
                {
                    p=array[j];
                    array[j]=array[i];//形参
                    array[i]=p;
                }
            }        
        }
        return 0;
    }
    int main()
    {
        int num=6;//这个num每次我只能自己提前设定好数组里的数字有几个,局限比较大。
        int array[6];
        for(int a=0;a<=6;a++)
        {
            printf("输入一个数组中的数字:");
            scanf("%d",&array[a]);
        }
        sort(array[6], num);
        return 0;
    }
    

    元素的位置。这是因为在这个代码段中,我们需要保留array[i]的值,以便将其赋给array[j],而将array[j]的值赋给array[i]如果直接进行赋值操作,会导致array[i]的值丢失。所以我们引入了临时变量p,用于暂存array[j]的值,然后完成两个元素的交换。

    //排序
    #include <stdio.h>
    int sort(int array[], int num)//要声明类型
    {
        for(int i=0;i<num;i++)
        {
            for(int j=i+1;j<num;j++)
            {
                int p;
                if(array[i]>array[j])
                {
                    p=array[j];
                    array[j]=array[i];//形参
                    array[i]=p;
                }
            }        
        }
    
    }
    int main()
    {
        int num=6;//这个num每次我只能自己提前设定好数组里的数字有几个,局限比较大。
        int array[6];
        for(int a=0;a<num;a++)
        {
            printf("输入一个数组中的数字:");
            scanf("%d",&array[a]);
        }
        sort(int array[], int num);
        printf("排好序的数组是:");
        for(int i=0;i<num;i++)
        {
            scanf("%d",array[i]);
        }
    }
    

    在输出排好序的数组时,应该使用printf()函数来打印数组元素,而不是使用scanf()函数。

gpt给的代码也不对呜呜呜。晚上再说。一个晚上竟然就变第三天了。

gpt代码

#include <stdio.h>

void bubbleSort(int array[], int num) {
    for(int i = 0; i < num - 1; i++) {
        for(int j = 0; j < num - i - 1; j++) {
            if(array[j] > array[j+1]) {
                // 交换相邻元素
                int temp = array[j];
                array[j] = array[j+1];
                array[j+1] = temp;
            }
        }
    }
}

int main() {
    int num = 6;
    int array[6];
    for(int a = 0; a < num; a++) {
        printf("输入一个数组中的数字:");
        scanf("%d", &array[a]);
    }

    bubbleSort(array, num);

    printf("排好序的数组是:");
    for(int i = 0; i < num; i++) {
        printf("%d ", array[i]);
    }
    printf("\n");

    return 0;
}

这个代码完全可以正确运行,它在我自己敲写的基础上多了printf("\n");然后呢,修改了我定义的sort()函数。

i < num - 1;

这个代码改的我不是很理解,gpt said

在冒泡排序算法中,外部循环的条件 `i < num - 1` 是为了确保只进行 `num - 1` 轮比较。

循环变量 `i` 表示当前已经排序好的元素个数。在每一轮的比较过程中,相邻的两个元素会进行比较,并根据需要进行交换。通过不断将最大的元素“冒泡”到数组的末尾,经过 `num - 1` 轮的比较后,所有的元素将会按照升序排列。

为什么外部循环的终止条件是 `i < num - 1` 而不是 `i < num` 呢?

考虑一个包含 `num` 个元素的数组。在第一轮比较结束后,最大的元素一定被放置在数组的末尾。同样地,在第二轮比较结束后,第二大的元素会被放置在倒数第二个位置。通过这种方式,每一轮比较都将至少放置一个元素到其最终的位置上。

因此,在进行 `num - 1` 轮比较后,`num - 1` 个最大的元素都已经被正确地放置在了它们应该出现的位置上。最后一个元素无需再次进行比较,因为它已经处于正确的位置上了。因此,外部循环的终止条件是 `i < num - 1`,确保只进行 `num - 1` 轮比较。

`printf("\n")`

`printf("\n")`是C语言中的输出语句,用于在终端或控制台上打印一个换行符(newline)。换行符可以将输出的文本移到下一行的开头,常用于在输出中创建新行或产生空行。

在这个特定的代码示例中,`printf("\n")`语句用于在排好序的数组输出之后打印一个换行。它的作用是在控制台上将光标移动到下一行的开头,使得接下来的输出在下一行开始。

这样做主要是为了使输出更加可读,每次运行程序时,排好序的数组将会以一个单独的、新的一行显示出来。

其实这个也可以不要,我试过了

最终代码

撒花花~

#include <stdio.h>

void Sort(int array[], int num) {
    for(int i = 0; i < num - 1; i++) {//最后一个元素无需比较
        for(int j = 0; j < num - i - 1; j++) {
            if(array[j] > array[j+1]) {
                // 交换相邻元素
                int temp = array[j];
                array[j] = array[j+1];
                array[j+1] = temp;
            }
        }
    }
}

int main() {
    int num = 6;
    int array[6];
    for(int a = 0; a < num; a++) {
        printf("输入一个数组中的数字:");
        scanf("%d", &array[a]);
    }

    Sort(array, num);

    printf("排好序的数组是:");
    for(int i = 0; i < num; i++) {
        printf("%d ", array[i]);
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值