冒泡排序

在今天的java入门课上,我们小组讲解了有关于冒泡排序的相关算法,因为冒泡排序方法比较简单,所以为了内容更加丰富,我们小组又添加了两种改良的冒泡排序算法:

             (1)通过加入一个flag来判断本次是否进行过交换,若交换过,则继续下一次,否则结束排序;

             (2)进行双向冒泡排序,同时拿到序列的最大值与最小值;



冒泡排序的基本思想:

        把每个数据看成一个气泡,按初始顺序自底向上依次对两两气泡进行比较,对上重下轻的气泡交换顺序(这里用气泡轻、重表示数据大、小),保证轻的气泡总能浮在重的气泡上面,直到最轻的气泡浮到最上面;保持最后浮出的气泡不变,对余下气泡循环上述步骤,直到所有气泡从轻到重排列完毕。


下面是根据冒泡排序的基本思想编写的基础代码:

class Solusion{
        /**
	 * 冒泡排序算法
	 * @param unsorted
	 */
	public static void bubble(int[] unsorted){
		int n = unsorted.length-1; //数组长度
		while(n>0){
			int i = 0;
			int j = i+1;
			while(j<=n){
				if(unsorted[i]>unsorted[j]){
					int temp = unsorted[i];
					unsorted[i] = unsorted[j];
					unsorted[j] = temp;
				}
				i++;
				j++;
			}
			n--;
		}
	}
}


当然,冒泡排序还有另外的实现方式,使用一种暴力的方式,按照冒泡排序的规则进行排序,具体的代码实现如下:

class Solusion{
    /**
	 * 暴力冒泡排序
	 * @param unsorted
	 */
	public static void bubble(int[] unsorted){
		int temp = 0;
		for(int i = 0;i<unsorted.length;i++){
			for(int j = i+1;j<unsorted.length;j++){
				if(unsorted[i]>unsorted[j]){
					temp = unsorted[i];
					unsorted[i] = unsorted[j];
					unsorted[j] = temp;
				}
			}
		}
	}
}





冒泡排序优化算法1:通过加入一个flag来判断本次是否进行过交换,若交换过,则继续下一次,否则结束排序;


class Solution{
    public static void bubble_1(int r[], int n) {
		int i = n - 1; // 初始时,最后位置保持不变
		while (i > 0) {
			int pos = 0; // 每趟开始时,无记录交换
			for (int j = 0; j < i; j++)
				if (r[j] > r[j + 1]) {
					pos = j; // 记录交换的位置
					int tmp = r[j];
					r[j] = r[j + 1];
					r[j + 1] = tmp;
				}
			i = pos; // 为下一趟排序作准备
		}
	}
}

冒泡排序优化算法2:进行双向冒泡排序,同时拿到序列的最大值与最小值;


class Solution{
    	public static void bubble_2(int r[], int n) {
		int low = 0;
		int high = n - 1; // 设置变量的初始值
		int tmp, j;
		while (low < high) {
			for (j = low; j < high; ++j)
				// 正向冒泡,找到最大者
				if (r[j] > r[j + 1]) {
					tmp = r[j];
					r[j] = r[j + 1];
					r[j + 1] = tmp;
				}
			--high; // 修改high值, 前移一位
			for (j = high; j > low; --j)
				// 反向冒泡,找到最小者
				if (r[j] < r[j - 1]) {
					tmp = r[j];
					r[j] = r[j - 1];
					r[j - 1] = tmp;
				}
			++low; // 修改low值,后移一位
		}
	}
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值