算法——java实现冒泡排序

package demo_bubble_sort;
//想象数组是垂直的存储在计算机中,底部 值较小的元素像气泡一样浮上去
public class shunxubiao {
	// 定义一个用于排序的顺序表结构
	int length;// 用于记录顺序表的长度
	int[] l = new int[length + 1];// 用于存储排序数组,长度加一就把下标和顺序统一,更好理解。

	public shunxubiao(int a,int[]b) {
		// TODO 自动生成的构造函数存根
		this.length = a;
		this.l = b;
	}
}

package demo_bubble_sort;

/**
 * 冒泡排序:一种交换排序,它的基本思想是:两两比较相邻记录的关键字, 如果反序则交换,直到没有反序的记录为止 * @author wu_pc
 *
 */

public class Bubble {



	// 初级版
	public static void BubbleSort0(shunxubiao a) {
		// 比较顺序表中的元素,第一个和后面的每一个进行比较,如果发现比第一个小的数,交换位置
		// 内层循环结束,顺序表的第一位已经是最小的数了,外层循环i加一,第二个数开始比较
		int i, j;
		for (i = 1; i < a.length; i++) {
			for (j = i + 1; j <= a.length; j++) {
				// 如果比较的数比被比较的大
				if (a.l[i] > a.l[j]) {
					// 交换两个元素
					int p = a.l[i];
					a.l[i] = a.l[j];
					a.l[j] = p;
				}
			}
		}

	}

	public static void BubbleSort1(shunxubiao a) {
		// 刚才那一种是从上往下比较,从数组的第一个元素开始比较,这种是从下往上比较
		// 可以从图片上看出,在第一次内层循环结束后,我们不仅将1移到了第一位,还将2移到了第三位
		// 当上万条数据排序时,这种差异会显现出来
		int i, j;
		// 外层循环一次,数组头部的一位就不再比较了
		for (i = 1; i < a.length; i++) {
			// 数字像气泡一样浮上去
			for (j = a.length - 1; j >= i; j--) {
				if (a.l[j + 1] < a.l[j]) {
					// 交换两个元素
					int p = a.l[j + 1];
					a.l[j + 1] = a.l[j];
					a.l[j] = p;
				}
			}
		}
	}

	public static void BubbleSort2(shunxubiao a) {
		// 当一个 {2,1,3,4,5}的数组比较时,当1和2交换后,已经是有序数组了,没有再比较的必要
		// 可以理解为当有一次循环,没有数据交换,这个数组已经有序了
		int i, j;
		boolean flag = true;// 定义一个标志位
		// &&与,当左右两边都为真时,表达式为真
		// 当flag为flase时(没有数据交换),退出循环(不再进行比较)
		for (i = 1; i < a.length && flag; i++) {
			flag = false;
			for (j = a.length - 1; j >= i; j--) {
				if (a.l[j + 1] < a.l[j]) {
					// 交换两个元素
					int p = a.l[j + 1];
					a.l[j + 1] = a.l[j];
					a.l[j] = p;
					flag = true;
				}
			}
		}
	}
	// 本文思路都来自大话数据结构,原书为C语言实现,在用JAVA语言实现过程中加深了理解,但是记忆程度还是不够深刻
	// 自己完全背写可能会卡住,还得不断学习,励志前行,永远不晚,在写代码的过程中找到了书中的一个错误
	public static void main(String[] args) {
		int[] a = { 0, 4, 3, 1, 2, 0, 4, 7, 8799, 75, 225, 25328, 9, 998, 5, 6, 5 };
		shunxubiao c = new shunxubiao(16, a);
	
		BubbleSort2(c);
		
		for (int i = 1; i <= c.length; i++) {
			System.out.println(c.l[i]);
		}
	//调试用代码,可能数据量不够大,几种排序函数用System类下获取时间方法计算后没有区别,没有贴出
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值