排序算法之冒泡排序(Java)



冒泡排序即每次遍历。相邻数字间进行比较,前者大于后者进行交换,不断将最大值后移,直至沉至最后位置;算法关键要点在于确定每次循环的边界;

后面两种算法则是对冒泡排序一定程度上的改良,但相对于其他排序算法,冒泡排序性能依然较差。

public class BubbleSort {


	//最原始的解法  
	public static void bubble_sort1(int[] data) {
		int n = data.length;
		for (int i = 0; i < n; i++) {
			// 注意循环的index范围,避免溢出
			for (int j = 0; j < n - i - 1; j++) {
				if (data[j] > data[j + 1]) {
					swap(data, j, j + 1);
				}
			}
		}
	}
	
	
	//改进算法,通过引入一个标志量flag,判断一次循环是否有移动,若无移动,则表示  
    //排序已经完成,无需在进行下一次继续循环  
	public static void bubble_sort2(int[] data) {
		int n = data.length;
		boolean flag = true;// 标示是否进行了移动
		int index = n; // 标示需要循环的最后一位的index
		// 一旦在移动,则继续循环
		while (flag) {
			flag = false;
			for (int j = 0; j < index - 1; j++) {
				if (data[j] > data[j + 1]) {
					swap(data, j, j + 1);
					flag = true;
				}
			}
			index--;
		}
	}
	
	//改进算法二:当一次遍历中,最后m位都未进行转换,则表示后面n位都比当前这个最大数要大  
    //根据冒泡排序知,每次沉入最大值,则后面这些位一定已经排好序
	public static void bubble_sort3(int[] data) {
		int n = data.length;
		int index = n;

		while (index != 0) {
			int k = 0;
			for (int j = 0; j < index - 1; j++) {
				if (data[j] > data[j + 1]) {
					swap(data, j, j + 1);
					k = j + 1;
				}
			}
			index = k;
		}
	}

	private static void swap(int[] data, int a, int b) {
		int temp = data[a];
		data[a] = data[b];
		data[b] = temp;
	}

	public static void print_array(int[] data) {
		for (int num : data) {
			System.out.print(num);
			System.out.print(" ");
		}
	}
	
	public static void main(String[] args) {
		
		int[] datas = new int[100];
		
		int max = 100;
		int min = 10;
		
		for (int i = 0; i < datas.length; i++)
			datas[i] = (int) (Math.random() * (max - min) + min);
		
		bubble_sort3(datas);
		print_array(datas);
	}
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值