冒泡排序——c语言


/*循环控制:在冒泡排序中,我们通常使用两层嵌套的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循环的逻辑

  1. 外层循环 (for(i = 0; i < len - 1; i++)):

    • 这个循环负责确定排序的轮数。因为每一轮冒泡都会将当前未排序部分的最大值“冒”到正确的位置,所以每轮过后就少了一个需要排序的元素。
    • len - 1是因为数组是从0开始索引的,所以最后一个元素的索引是len - 1
    • i++表示每次循环结束后,i的值都会增加1,以进入下一轮排序。
  2. 内层循环 (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循环,我们可以打印出排序后的数组,以验证排序结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值