/*循环控制:在冒泡排序中,我们通常使用两层嵌套的for循环。外层循环控制排序的轮数,内层循环控制每轮排序中元素之间的比较和交换。
比较和交换:在每一轮排序中,我们比较相邻的两个元素,如果他们的顺序错误,我们就交换他们的位置。这个过程会持续到没有更多的元素需要交换,也就是说,数组已经排序完成。
时间复杂度:冒泡排序的时间复杂度是O(n^2),其中n是待排序数组的长度。这是因为每一轮排序都需要遍历整个数组,而排序的轮数通常是n-1。因此,冒泡排序在处理大数据集时可能效率较低。
稳定性:冒泡排序是一种稳定的排序算法,也就是说,如果两个元素的值相等,他们在排序后的数组中的相对位置不会改变。
优化:在冒泡排序中,如果在某一轮排序中没有发生任何交换,那么说明数组已经排序完成,我们可以提前结束排序过程。这种优化可以减少不必要的比较和交换操作。*/
#include<stdio.h>
int main(){
int arry[] = {5,9,82,50};//从大到小排序,数组名是 arry 内容大小是后续的
int i,j,temp;
int len = sizeof(arry) /sizeof (arry[0]) ; //定义数组长度,是arry /arry[0]
for(i =0;i<len-1 ;i++){
for(j = 0;j<len-1-i;j++){
if(arry[j]<arry[j+1]){
temp = arry[j] ;
arry[j] = arry[j+1] ;
arry[j+1] = temp ;
}
}
}
for(i =0;i<len ;i++){
printf("%d ",arry[i]);
}
return 0 ;
}
for循环的逻辑
-
外层循环 (
for(i = 0; i < len - 1; i++)
):- 这个循环负责确定排序的轮数。因为每一轮冒泡都会将当前未排序部分的最大值“冒”到正确的位置,所以每轮过后就少了一个需要排序的元素。
len - 1
是因为数组是从0开始索引的,所以最后一个元素的索引是len - 1
。i++
表示每次循环结束后,i
的值都会增加1,以进入下一轮排序。
-
内层循环 (
for(j = 0; j < len - 1 - i; j++)
):- 这个循环负责在每一轮中进行元素之间的比较和交换。
len - 1 - i
的原因是因为随着外层循环的进行,数组中已经有一部分元素被排好序了,因此不需要再对这些元素进行比较。例如,在第一轮排序结束后,最大的元素已经被放到了数组的最后,所以在第二轮排序时,我们只需要比较前面的len - 1
个元素。j++
表示每次循环结束后,j
的值都会增加1,以进行下一个元素的比较。
为什么这样给参数
sizeof(arry) / sizeof(arry[0])
: 这个表达式用于计算数组的长度。sizeof(arry)
返回数组arry
占用的总字节数,而sizeof(arry[0])
返回数组中一个元素占用的字节数。两者相除,就得到了数组中的元素个数,即数组的长度。- 在
if(arry[j] < arry[j+1])
中,我们比较相邻的两个元素arry[j]
和arry[j+1]
。如果arry[j]
小于arry[j+1]
,则交换它们的位置。这是因为我们要实现的是从大到小的排序,所以需要将较小的数“冒”到前面去。 - 交换操作使用了临时变量
temp
。首先,将arry[j]
的值赋给temp
,然后将arry[j+1]
的值赋给arry[j]
,最后将temp
的值赋给arry[j+1]
。这样就完成了两个元素的交换。
最后,通过一个简单的for
循环,我们可以打印出排序后的数组,以验证排序结果。