冒泡排序算法,C语言冒泡排序算法详解

冒泡排序算法,C语言冒泡排序算法详解冒泡排序是最简单的排序方法,理解起来容易。虽然它的计算步骤比较多,不是最快的,但它是最基本的,初学者一定要掌握。冒泡排序的原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一轮一轮地比较,最后实现从小到大排序。比如对下面这个序列进行从小到大排序:9021132-5834第一轮:

大家好,又见面了,我是你们的朋友全栈君。

冒泡排序是最简单的排序方法,理解起来容易。虽然它的计算步骤比较多,不是最快的,但它是最基本的,初学者一定要掌握。

冒泡排序的原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。

以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一轮一轮地比较,最后实现从小到大排序。

比如对下面这个序列进行从小到大排序:
90 21 132 -58 34

第一轮:

  1. 90 和 21比,90>21,则它们互换位置:
    21 90 132 -58 34

  2. 90 和 132 比,90<132,则不用交换位置。

3)132 和 –58 比,132>–58,则它们互换位置:
21 90 -58 132 34

4)132 和 34 比,132>34,则它们互换位置:
21 90 -58 34 132

到此第一轮就比较完了。第一轮的结果是找到了序列中最大的那个数,并浮到了最右边。

比较时,每轮中第 n 次比较是新序列中第 n 个元素和第 n+1 个元素的比较(假如 n 从 1 开始)。

第二轮:

  1. 21 和 90 比,21<90,则不用交换位置。

  2. 90 和 –58 比,90>–58,则它们互换位置:
    21 -58 90 34 132

  3. 90 和 34 比,90>34,则它们互换位置:
    21 -58 34 90 132

到此第二轮就比较完了。第二轮的结果是找到了序列中第二大的那个数,并浮到了最右边第二个位置。

第三轮:

  1. 21 和 –58 比,21>–58,则它们互换位置:
    -58 21 34 90 132

  2. 21 和 34 比,21<34,则不用交换位置。

到此第三轮就比较完了。第三轮的结果是找到了序列中第三大的那个数,并浮到了最右边第三个位置。

第四轮:

  1. –58 和 21 比,–58<21,则不用交换位置。

至此,整个序列排序完毕。从小到大的序列就是“–58 21 34 90 132”。从这个例子中还可以总结出,如果有 n 个数据,那么只需要比较 n–1 轮。而且除了第一轮之外,每轮都不用全部比较。因为经过前面轮次的比较,已经比较过的轮次已经找到该轮次中最大的数并浮到右边了,所以右边的数不用比较也知道是大的。

废话也不多说了,直接上码

#include <stdio.h>
void main()
{ 
    
	int num,n,temp;//定义变量
	int a[100];   //初始化数组
    printf("您要重新排列多少个数: \n");
	scanf("%d",&num);
	n=num;  //获取数组的长度 另外还有一种:n = sizeof(a) / sizeof(a[0]); 
			/*a[0]是int型, 占4字节, 所以总的字节数除以4等于元素的个数*/
	int i=0;
	printf("请您输入排列的数:\n");
	while ( scanf("%d",&a[i]) && num >1)  //循环向数组中存入数
	{ 
   
		i++;
		num--;
	}
	printf("排列之前的顺序为:");
	for (int length=0;length<n;length++)
	{ 
   
		printf("%3d",a[length]);
	}
	 for (int j=0; j<n-1; j++)  //比较n-1轮
    { 
   
        for (int k=0; k<n-1-j; k++)  //每轮比较n-1-j次,
        { 
   
            /* if (a[k] < a[k+1]) //从大到小 { temp = a[k]; a[k] = a[k+1]; a[k+1] = temp; } */
			if (a[k] > a[k+1]) //从小到大
			{ 
   
				temp = a[k];
				a[k] = a[k+1];
				a[k+1] = temp;
			}
        }
	 }
	printf("\n");
	printf("排列之后的顺序为:");
	for (int len=0;len<n;len++)
	{ 
   
		printf("%3d",a[len]);
	}
	printf("\n");
}

结果如下图所示:
在这里插入图片描述
有人或许会问程序中,为什么每轮比较的次数是 k<n–1–j,而不是 k<n–1?

因为冒泡排序有一个特点,这个程序是从小到大排序,所以第一轮排序以后,最大的数就会浮到最右面;第二轮排序以后,第二大的数会浮到倒数第二个位置;第三轮排序以后,第三大的数会浮到倒数第三个位置……也就是说,排序多少轮,就有多少个数字已经按排序要求排好了,它们不需要再比较。写 k<n–1 也可以,只不过程序在执行时多做了许多无用功。

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • QT的基本知识「建议收藏」

    QT的基本知识「建议收藏」QT是一个跨平台应用程序和UI开发框架。具体的安装以及源文件的下载这里不详细介绍。要在QT界面上添加一个按钮,可以有两种方法:一个是直接拖放一个按钮即可;另一种则是通过程序来添加一种按钮。QT提供的信号和槽机制,可以让任意两个对象之间进行消息处理,其作用就是让一个对象产生的信号能够被另一个对象接受并处理。QT基本所有的对象都集成在QObject对象中,在这个对象中有一个静态函数connect…

    2022年5月17日
    36
  • 原码,反码,补码的深入理解与原理答案_原码反码补码例题详解

    原码,反码,补码的深入理解与原理答案_原码反码补码例题详解本文从原码讲起。通过简述原码,反码和补码存在的作用,加深对补码的认识。力争让你对补码的概念不再局限于:负数的补码等于反码加一。接触过计算机或电子信息相关课程的同学,应该都或多或少看过补码这哥仨。每次都是在课本的最前几页,来上这么一段:什么反码是原码除符号位,按位取反。补码等于反码加一。然后给整得莫名其妙,稀里糊涂地,接着就是翻页,反正后面的内容也跟三码没多大关系。我原来也是…

    2025年11月27日
    2
  • java语言_java好学吗?java是不是最难学的语言?

    java语言_java好学吗?java是不是最难学的语言?java好学吗?java是不是最难学的语言?对于一些刚接触java的朋友来说,可能会有这样的疑问,下面就来一起了解下吧。1、java好学吗?  从某些方面来说,java比较容易学,如果是大学毕业,大学计算机专业里大多开设了java基础课程,或者学过一点编程,学起java来也会轻松不少。即使是零基础也不用担心,java可以零基础授课,入门比较简单,难的是学深入,这不是一件容易的事。学习java…

    2022年7月7日
    25
  • linux vim命令详解_linux中查看文件内容的命令

    linux vim命令详解_linux中查看文件内容的命令 vim是linux中最基本的操作vim常用模式1、命令模式2、插入模式3、底行模式4、可视化模式,命令模式按v进入5、替换模式,命令模式下按r进入1、插入模式默认进入文件打开的是命令模式在这个模式下是不能插入字符的按“i”键,然后就进入到插入模式了,屏幕下面有个“–INSERT–”标识,很明显的现在就能写你的文档了,写完后按“Esc"键就…

    2025年7月2日
    4
  • 计算一段日期内的周末天数(星期六,星期日总和)(

    计算一段日期内的周末天数(星期六,星期日总和)(简介:这是计算一段日期内的周末天数(星期六,星期日总和)(的详细页面,介绍了和php,有关的知识、技巧、经验,和一些php源码等。class='pingjiaF'framebord

    2022年7月3日
    36
  • Linux下安装Redis

    Linux下安装Redis官网下载链接:https://redis.io/download1、选择Stable(5.0)下的Download5.0.0链接进行下载(stable是稳定版本,默认下载的是linux版本)2、下载完成之后,打开WinSCP,把我们下载好的Redis压缩包,上传到Linux的/mnt/文件目录下3、使用putty连接到我们的Li…

    2022年4月30日
    49

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号