冒泡排序及算法优化

1.简单冒泡排序

用双重循环来控制,当相邻元素不满足要求的顺序排列(从小到大或从大到小)时,就将两元素交换位置,以此逐渐遍历。

  • 代码1
void bubbleSort(int[] array) {

		int tmp = 0;
		long startTime = System.currentTimeMillis();
		for (int i = 0, arrLen = array.length; i < arrLen - 1; i++) {
			for (int j = 0; j < arrLen - i - 1; j++) {
				if (array[j] > array[j + 1]) {
					tmp = array[j];
					array[j] = array[j + 1];
					array[j + 1] = tmp;

				}
			}
		}
		long endTime = System.currentTimeMillis();
		//打印排序后的前10个数
		for(int i=0;i<10;i++){
			System.out.print(array[i]+" ");
		}
		System.out.println("数组冒泡排序用时:" + (endTime - startTime) + "毫秒。");

	}

2.有序冒泡排序

如果只遍历两三次,数组本身就已经是有序的了,那么对后面的元素继续循环地进行大小判断则是多余的了。我们可以设置一个标签来标记当前次遍历的数组是否是有序的。

  • 代码2
void bubbleSortByOptim(int[] array) {
		int tmp = 0;
		long startTime = System.currentTimeMillis();
		//记录当前是否无序的标签
		boolean isUnorder = true;
		for (int i = 0, arrLen = array.length; i <( arrLen - 1 )&& isUnorder; i++) {
			//每次外部循环一次,isUnorder设为false,即预设当前序列已经是有序的
			isUnorder = false;
			for (int j = 0; j < arrLen - i - 1; j++) {
				/* 只要当前内循环有两个元素需要交换位置则表明,前当序列还是无序的,将isUnorder从预设值false改为true,外循环还将继续
				 *只有当前序列没有任何元素需要交换位置(有序),isUnorder = false(即不进入if的代码区内),外循环将停止
				 */
				if (array[j] > array[j + 1]) {
					tmp = array[j];
					array[j] = array[j + 1];
					array[j + 1] = tmp;
					isUnorder = true;
				}
			}
		}
		long endTime = System.currentTimeMillis();
		//打印排序后的前10个数
		for(int i=0;i<10;i++){
			System.out.print(array[i]+" ");
		}
		
		System.out.println("数组冒泡排序优化后用时:" + (endTime - startTime) + "毫秒。");

	}
  • 辅助代码3
   int nums1[] = new int[100000];
   int nums2[] = new int[100000];
   public static void main(String[] cmds)
   	ArraySort as= new ArraySort();
   	as.initArrays();
   	as.bubbleSort(as.nums1);
   	as.bubbleSortByOptim(as.nums2);
   }
   public void initArrays() {
   	Random rd = new Random();
   	 for(int i=0 ; i< nums1.length;i++){
   	 nums1[i] =rd.nextInt(100000);
   	 }
   	nums2 = Arrays.copyOf(nums1, nums1.length);
   }
  • 控制台输出
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值