Java再学习-算法之冒泡排序

  

           Java排序,据说有八大排序,小编这次系列博客可能讲不了全部,我将自己理解比较到位的几个排序,和大家分享一下吧。今天来说一说冒泡排序,其实冒泡排序属于交换排序的一种,冒泡排序是最经典的交换排序,它的算法思想是:(假设数据存放在数组a[n]中)

  1.比较a[0]和a[1],如果a[0]>a[1],则交换a[0],a[1],然后比较新的a[1](可能是原来的a[0])和a[2],如果a[1]>a[2],则交换a[1],a[2],以此类推,直到a[n-2]和a[n-1]比较完毕,这样,a中的最大数就“沉底”了,即a[n-1]是数组a中的最大值。
  2.从头开始继续第1步的操作,所不同的是本次比较到a[n-2]即可结束,这样数组a中的次大值就被交换到a[n-2]的位置。
  3.以此比较n-1次,数组a就按照从小到大的顺序排好了。(也可以判断是否有交换发生,如果一趟比较没有发生交换,则表示数组a已经排好序)。

       理论总是很虚,直接上代码吧,因为在代码中我们才能找到自己的思路,代码中我也进行了详细的分析:

package cn.tgb.sort;

import java.util.Arrays;

//冒泡排序
public class BubbleSort {
	public static void main(String[] args) {
		// 生成随机数
		int[] values = new int[] { (int) (Math.random() * 100),
				(int) (Math.random() * 100), (int) (Math.random() * 100),
				(int) (Math.random() * 100), (int) (Math.random() * 100),
				(int) (Math.random() * 100), (int) (Math.random() * 100) };
		//打印出随机数
		System.out.println(Arrays.toString(values));
		//调用排序逻辑
		sort(values);
		//最后打印出排序后的随机数
		System.out.println(Arrays.toString(values));
	}
	//排序逻辑
	private static void sort(int[] values) {
		//定义中间变量
		int temp;
		//总共两套循环,外循环和内循环。从第一个数组到最后一个
		//外循环第一次是0-6;第二次1-6
		for (int i = 0; i < values.length; i++) {
			//内循环 ,比较次数逐步减1,因为前排排好的就可以不用继续排了。
			//针对下面的values.length - i - 1,我的理解是,在内部循环中
			//在j和j+1(也就是最后两位)进行对比,j要进行加1,如果上面不减去一,那么下面就要写j-1和j
			for (int j = 0; j < values.length - i - 1; j++) {
				//比较相邻的元素,如果前面大于后面。
				if (values[j] > values[j + 1]) {
					//调换两个元素的位置
					temp = values[j];
					values[j] = values[j + 1];
					values[j + 1] = temp;
				}
				
			}
			//有没有这种情况 在循环结束后,顺序还是乱序的情况呢?
			//打印出每次循环输出的结果。
			System.out.println("第" + (i + 1) + "次排序");
			for (int k = 0; k < values.length; k++) {
				//采用不换行输出,便于查看
				System.out.print(values[k] + " ");
			}
			System.out.println(" ");
		}

	}

}
输出结果如下:


小编在考虑这样一个问题,在第三次循环的时候,其实已经是有序化了,但是后面还要进行无用的四次排序,浪费了好多资源。这样,我们可以设置一个标志位,默认是false,当发生了一次交换后,变成true,如果在进行到第四次循环时,不进行交换,也就是说标志位依旧是false,那么我们就跳出循环,看下面代码:

package cn.tgb.sort;

import java.util.Arrays;

//冒泡排序
public class BubbleSort {
	public static void main(String[] args) {
		// 生成随机数
		int[] values = new int[] { (int) (Math.random() * 100),
				(int) (Math.random() * 100), (int) (Math.random() * 100),
				(int) (Math.random() * 100), (int) (Math.random() * 100),
				(int) (Math.random() * 100), (int) (Math.random() * 100) };
		//打印出随机数
		System.out.println(Arrays.toString(values));
		//调用排序逻辑
		sort(values);
		//最后打印出排序后的随机数
		System.out.println(Arrays.toString(values));
	}
	//排序逻辑
	private static void sort(int[] values) {
		//定义中间变量
		int temp;
		//标记位,如果这一趟发生了交换,则为true,否则为false。明显如果有一趟没有发生交换,说明排序已经完成。
		boolean flag = false;
		//总共两套循环,外循环和内循环。从第一个数组到最后一个
		//外循环第一次是0-6;第二次1-6
		
		for (int i = 0; i < values.length; i++) {
			//内循环 ,比较次数逐步减1,因为前排排好的就可以不用继续排了。
			//针对下面的values.length - i - 1,我的理解是,在内部循环中
			//在j和j+1(也就是最后两位)进行对比,j要进行加1,如果上面不减去一,那么下面就要写j-1和j
			for (int j = 0; j < values.length - i - 1; j++) {
				//比较相邻的元素,如果前面大于后面。
				if (values[j] > values[j + 1]) {
					//调换两个元素的位置
					temp = values[j];
					values[j] = values[j + 1];
					values[j + 1] = temp;
					//发生交换,将flag置为true
					flag = true;
				}
				
			}
			//没有发生交换,则表明已是有序,跳出循环
            if(flag==false){
                break;
            }
			//有没有这种情况 在循环结束后,顺序还是乱序的情况呢?
			//打印出每次循环输出的结果。
			System.out.println("第" + (i + 1) + "次排序");
			for (int k = 0; k < values.length; k++) {
				//采用不换行输出,便于查看
				System.out.print(values[k] + " ");
			}
			System.out.println(" ");
		}

	}

}
小编个人比较喜欢冒泡排序,以为算法稳定,比较好理解。下篇小编将送上插入排序的讲解


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值