zl程序教程

您现在的位置是:首页 >  其他

当前栏目

冒泡法原理及实现

原理 实现 冒泡
2023-06-13 09:14:29 时间

冒泡法原理及实现

第一次接触排序算法,简单写一下实现原理。 先看一道例题: 用户输入十个数据,将数据从大到小输出。 输入样例 1 30 23 56 0 199 -23 45 78 -200 输出样例 -200 -23 0 1 23 30 45 56 78 199 这里使用冒泡法。别的排序目前我也不太会 代码示例:

#include<stdio.h>
int main(void)
{
    int num[11];
    int i,j;
    int temp;
    for(i=0;i<10;i++)
        scanf("%d",&num[i]);
    for(i=0;i<10-1;i++)				//这里只需进行九次循环,第十次的数已经是最小值,不需要进行排序 
        for(j=0;j<10-1-i;j++)		//这里只需进行n-i-1次排序,因为前i个数已经排好了序 
          if(num[j]>num[j+1])
          {
            temp=num[j];
            num[j]=num[j+1];
            num[j+1]=temp;
          }
    for(i=0;i<10;i++)
        printf("%d ",num[i]);
        
    return 0;
}

问题来了问什么叫冒泡

画了一个示意图,大概是这么个意思(观察过气泡在水中上升的同学可能比较明白,这个问题应该是和压力有关?!)

经过一次循环已经能看出一些端倪。最大数字经过一次循环已经放置到数组的最后一位,这里就不赘述后面的相似循环了,相信读者已经能根据第一次循环想到后面的情况了。 下面我们来详细分析一下代码: for(i=0;i<10-1;i++) 第一个循环很简单,就是要循环n-1次,可能有人会问,为什么是n-1次?因为每次循环都会把当前循环中的最大一位放到右端,在第n-1次放完后,数组最左端的数字已经是最小的,不需要n次循环。 for(j=0;j<10-i-1;j++) 第二个循环也很简单,循环n-i-1次,为什么是n-i-1?同上,右端经过一次比较就会替换成最大值,每次循环放置一个当前循环的最大值,所以循环完全不必要进行10次,减去已经放好的值的数量(执行一次放一个,执行i次就是i个)可以提高程序运行的速度。 if(num[j]>num[j+1]) { temp=num[j]; num[j]=num[j+1]; num[j+1]=temp; } 第二个循环中嵌套了一个if条件用于实现程序的关键,交换。 如果前一个值大于后一个值,就交换他们,这里注意,不能直接换值, num[j]=num[j+1]; num[j+1]=num[j]; 虽然我相信很少人会犯这种低级错误。但是还是要解释一下这里换值的实现方式: 可以想象如下场景,A杯子装有可乐,B杯子装有雪碧,我们要交换为A杯子装雪碧,B杯子装可乐。直接换是不可能的,相信读者已经能想到了,在拿一个新杯子。让可乐先装在新杯子里,再把A杯子里装上B中的雪碧,这时B杯子已经空出来了,把新杯子里的可乐装到B杯子中,就能完成。 这里换值的操作完全与上面的情景相同,temp就是我们拿来的新杯子。 for(i=0;i<10;i++) printf(“%d “,num[i]); 最后的循环负责打印结果,这个没什么好说的。

这里也可以考虑一下如何让程序降序排列。 2018/11/9创建 2018/12/9修改

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/180260.html原文链接:https://javaforall.cn