连小白都能看得懂的冒泡排序,不看后悔

冒泡排序简介

冒泡排序是一个简单易上手的排序方法。其工作原理和它的名字一样,“冒泡”顾名思义像水中的气泡一样,起初在最底层,一层一层往水平面上移动。说白了就是以一个基准元素和它左右两边的元素做比较,比它小则保持原位置不动,比它大就交换位置,直至把最大的一个元素放在最末端位置。下面拿一个例子来讲解:
现在有一个无序数组,要对其进行从小到大的顺序排序:
原数组:10,1,35,61,89,36,55

首先拿最左边的元素“10”开始比较,10>1,两个元素交换位置,再拿较大的那个(10)和其右边的35开始比较,10<35位置不变,再拿较大的那个(35)和其右边61比较,35<61位置不变,再拿61和89比较,61<89位置不变,再拿89和36比较,89>36交换位置,89和55比较,89>55交换位置,一趟比较完毕

第一趟排序:1,10,35,61,36,55,89 (比较了6次,把最大的89推到最右边)
第二趟排序:1,10,35,36,55,61,89(比较了5次,把最大的61推到其次)
第三趟排序:1,10,35,36,55,61,89(比较了4次,把最大的55推到其次)
第四趟排序:1,10,35,36,55,61,89(比较了3次,把最大的36推到其次)
第五趟排序:1,10,35,36,55,61,89(比较了2次,把最大的35推到其次)
第六趟排序:1,10,35,36,55,61,89(比较了1次,把最大的10推到其次)

要通过代码实现以上排序,代码如下:

public class Test {
	public static void sort(int[] arrary) {
		int i, j;
		for (i = 0; i < arrary.length; i++) {// 这是要比较的趟数
			for (j = 1; j < arrary.length - i; j++) {
				if (arrary[j - 1] > arrary[j]) {// 若前一个元素大于后一个元素,交换位置
					int th;
					th = arrary[j - 1];
					arrary[j - 1] = arrary[j];
					arrary[j] = th;
				}
			}
		}
	}

	// 来测试一下
	public static void main(String[] args) {
		int[] arrary = { 10, 1, 35, 61, 89, 36, 55 };
		Test.sort(arrary);// 因为sort()是static修饰,所以只需要通过类名调用即可
		for (int i : arrary) {// 遍历出数组
			System.out.print(i + ",");
		}
	}
}

运行结果如下:
在这里插入图片描述

改良版冒泡排序:用于一部分元素已经有顺序,减少排序的复杂性

//改良版冒泡排序,适用于如果一个数组中有一部分已经排好序了的情况
public class NewSort {
	public static void sort(int[] a) {
		int i,j=a.length;
		boolean flag = true;//设置一个标志,如果这一趟发生了交换就设置为true,如果没交换就是FALSE,如果没有交换就说明已经排序了
		
		while(flag) {
			flag =false;//在开始排序之前,假设都没有排序
			for (i = 1;  i<j; i++) {
				if (a[i-1]>a[i]) {//这是升序,如果前面数字大于后面数字就交换
					int th;
					th = a[i-1];
					a[i-1]=a[i];
					a[i]=th;
					flag = true;//表示已经交换过
				}
			}
			j--;//减小一次排序的尾边界
		}
	}
	
	public static void main(String[] args) {
		int[] a= {2,5,1,5,6};
		NewSort.sort(a);
		for(int i:a) {
			System.out.print(i+",");
		}
	}
}

运行结果如下:
在这里插入图片描述

以上是本人初步理解,如果有不足还希望各位大牛指出更正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值