每日小语
一个人倘若需要从思想中得到快乐,那么他的第一个欲望就是学习。——王小波
自己思考
这不前几天刚搞的东西吗,就写成一个函数,这个有什么难的吗?我有时候那个分别心特重啊,真就别人拿到个啥好的比杀了我还难受,没关系,我承认我贱,我接受好吧,谁让我是个人呢。
之前提到是冒泡排序对吧,就是比较比较比较,然后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行出现了两个错误:
-
i
和j
的定义:在代码的开头,使用了int i, j;
来声明i
和j
,但此时i
和j
还没有被初始化,因此无法用它们来声明数组。你应该在读取num
后定义array
数组,并使用正确的大小。 -
数组作为参数传递:在sort函数的参数中,你使用了
array
作为函数的参数,但在使用时没有指定数组的大小。你可以将数组大小作为另一个参数传递给sort函数,或者在代码中使用全局变量来定义数组的大小。 -
还有就是交换数字的时候设置了一个中间变量,我也搞不懂。在代码段
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;
}