冒泡排序_冒泡排序详解

冒泡排序是一种基础排序算法,通过重复遍历数列并交换相邻元素来排序。文章详细解释了冒泡排序的工作原理,并提出了优化算法,包括在未发生交换时提前结束循环以及减少额外空间的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

a9cfdb73b1e3f23b0a2f67b3602b0d5c.png

1、冒泡排序的基础算法

冒泡排序是最常用的排序算法,在笔试中也非常常见,能手写出冒泡排序算法可以说是基本的素养。

算法重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来,这样越大的元素会经由交换慢慢“浮”到数列的顶端。

冒泡排序算法的运作如下:

1) 如有一个数列有 N(5)个元素,则至多需要 N-1(4)趟循环才 能保证数列有序

2) 每一趟循环都从数列的第一个元素开始比较,依次比较相 邻的两个元素,比较到数列的最后

3) 如果前一个元素大于后一个元素,则使用第三变量交换

大家可以用如上思想,将下面的人按照身高从低到高重新排列:

15a1548012d41a7031620ac6d80b2127.png
import java.util.Arrays;
public class TestBubbleSort {
	public static void main(String[] args) {
		int[] values = {75,87,56,45,49};
		System.out.println("排序前:" + Arrays.toString(values));
		bubbleSort(values);
		System.out.println("排序后:" + Arrays.toString(values));
	}
	public static void bubbleSort(int[] values) {	
		for (int i = 0; i < values.length-1; i++) {//比较得轮数
			for (int j = 0; j < values.length-1; j++) {
				//相邻两数进行比较
				if(values[j] > values[j+1]) {
					//第三变量交换位置
					int temp = values[j];
					values[j] = values[j+1];
					values[j+1] = temp;
				}
			}
		}	
	}
}

c94bef0a981ee1336faf11d6d48098d6.png

运行结果:

de6af6bfd4ebc267e58592f3b33f183e.png

2、冒泡排序的优化算法

其实,我们可以冒泡排序的算法优化一下,基于冒泡排序的以下特点进行优化:

1.整个数列分成两部分:前面是无序数列,后面是有序数列。初始状态下,整个数列都是无序的,有序数列是空。每一趟循环可以让无序数列中最大数排到最后,(也就是说有序数列的元素个数增加1),也就是不用再去顾及有序序列。

2.不管是否有序,都要进行 N-1 趟循环?判断每一趟是否发生了数组元素的交换,如果没有发生,则说明此时数组已经有序,无需再进行后续趟数的比较了。此时可以中止比较。定义一个 boolean 类型的变量 flag,默认有序 true;发生交 换,置为 false,一趟循环结束后,根据 flag 的值判断是否有序。有序,则退出循环。

http://3.int temp 每次比较的时候都要给 temp 分配空间,比较完 毕后翻放空间所有的比较都使用一个 temp 变量,同一个空间,将 temp 变量提取到大循环外 。

6ebb5a85a92734433db1bd4bbe2d2706.png
import java.util.Arrays;
public class TestBubbleSort2 {
	public static void main(String[] args) {
//		int[] values = {75,87,56,45,49};
		int[] values = {1,2,3,4,5};
		System.out.println("排序前:" + Arrays.toString(values));
		int count = bubbleSort(values);
		System.out.println("排序后:" + Arrays.toString(values));
		System.out.println("共比较了" + count + "轮");
	}
	public static int bubbleSort(int[] values) {
		boolean flag;//标记数组是否已达到有序状态
		int temp;//第三变量初始化一次节约空间
		int count = 0;//统计比较的轮数
		for (int i = 0; i < values.length-1; i++) {//比较的轮数
			flag = true;//默认有序
			count++;
                   //只需比较无序部分即可
			for (int j = 0; j < values.length-1-i; j++) {
				//相邻两数进行比较
				if(values[j] > values[j+1]) {
					//第三变量交换位置
					temp = values[j];
					values[j] = values[j+1];
					values[j+1] = temp;
					//本趟发生了交换,表明该数组在本趟处于无序状态
					flag = false;
				}
			}
			if(flag) {
				break;//退出循环,证明数组有序
			}
		}
		return count;
	}
}

尚学堂百战程序员

百战程序员_IT6000集_影响6000万学习IT的中国人【官网】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值