java冒泡排序

这篇具有很好参考价值的文章主要介绍了java冒泡排序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.基本介绍

冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,
若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。

优化:
因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在
排序过程中设置一个标志 flag 判断元素是否进行过交换。从而减少不必要的比较。(这里说的优化,可以在冒泡排
序写好后,在进行)

2.演示冒泡过程的例子(图解)

java冒泡排序,java学习,java,排序算法,算法

小结上面的图解过程:

(1) 一共进行 数组的大小-1 次 大的循环

(2)每一趟排序的次数在逐渐的减少

(3) 如果我们发现在某趟排序中,没有发生一次交换, 可以提前结束冒泡排序。这个就是优化

3.冒泡排序应用实例

我们举一个具体的案例来说明冒泡法。我们将五个无序的数:3, 9, -1, 10, -2 使用冒泡排序法将其排成一个从小
到大的有序数列。

代码实现:

import java.util.Arrays;

public class BubbleSort {

	public static void main(String[] args) {
		int arr[] = { 3, 9, -1, 10, -2 };

		// 为了容量理解,我们把冒泡排序的演变过程,给大家展示

		// 第一趟排序,就是将最大的数排在最后
		int temp = 0; // 临时变量
		for (int j = 0; j < arr.length - 1; j++) {
			// 如果前面的数比后面的数大,则交换
			if (arr[j] > arr[j + 1]) {
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
		System.out.println("第一趟排序后的数组");
		System.out.println(Arrays.toString(arr));

		// 第二趟排序,就是将第二大的数排在倒数第二位
		for (int j = 0; j < arr.length - 1 - 1; j++) {
			// 如果前面的数比后面的数大,则交换
			if (arr[j] > arr[j + 1]) {
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
		System.out.println("第二趟排序后的数组");
		System.out.println(Arrays.toString(arr));

		// 第三趟排序,就是将第三大的数排在倒数第三位
		for (int j = 0; j < arr.length - 1 - 2; j++) {
			// 如果前面的数比后面的数大,则交换
			if (arr[j] > arr[j + 1]) {
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
		System.out.println("第三趟排序后的数组");
		System.out.println(Arrays.toString(arr));

		// 第四趟排序,就是将第 4 大的数排在倒数第 4 位
		for (int j = 0; j < arr.length - 1 - 3; j++) {
			// 如果前面的数比后面的数大,则交换
			if (arr[j] > arr[j + 1]) {
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
		System.out.println("第四趟排序后的数组");
		System.out.println(Arrays.toString(arr));
	}

}

改良后代码

import java.util.Arrays;

public class BubbleSort {

	public static void main(String[] args) {
		int arr[] = { 3, 9, -1, 10, -2 };

		// 为了容量理解,我们把冒泡排序的演变过程,给大家展示

		// 冒泡排序的时间复杂度 O(n^2)
		int temp = 0; // 临时变量
		boolean flag = false; //标识变量,表示是否进行交换
		for (int i = 0; i < arr.length - 1; i++) {

			for (int j = 0; j < arr.length - 1 - i; j++) {
				// 如果前面的数比后面的数大,则交换
				if (arr[j] > arr[j + 1]) {
					flag = true;
					temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
			System.out.println("第" + (i + 1) + "趟排序后的数组");
			System.out.println(Arrays.toString(arr));
			if(!flag) {//在一趟排序中,一次交换都没发生过
				break;
				
			}else {
				flag = false;//重置flag,进行下次判断
			}
		}
		/*
		 * // 第二趟排序,就是将第二大的数排在倒数第二位 for (int j = 0; j < arr.length - 1 - 1; j++) { //
		 * 如果前面的数比后面的数大,则交换 if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j +
		 * 1]; arr[j + 1] = temp; } } System.out.println("第二趟排序后的数组");
		 * System.out.println(Arrays.toString(arr));
		 * 
		 * // 第三趟排序,就是将第三大的数排在倒数第三位 for (int j = 0; j < arr.length - 1 - 2; j++) { //
		 * 如果前面的数比后面的数大,则交换 if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j +
		 * 1]; arr[j + 1] = temp; } } System.out.println("第三趟排序后的数组");
		 * System.out.println(Arrays.toString(arr));
		 * 
		 * // 第四趟排序,就是将第 4 大的数排在倒数第 4 位 for (int j = 0; j < arr.length - 1 - 3; j++) {
		 * // 如果前面的数比后面的数大,则交换 if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j
		 * + 1]; arr[j + 1] = temp; } } System.out.println("第四趟排序后的数组");
		 * System.out.println(Arrays.toString(arr));
		 */
	}

}

测运行时间代码文章来源地址https://www.toymoban.com/news/detail-592930.html

import java.text.SimpleDateFormat;
import java.util.Date;

public class BubbleSort {

	public static void main(String[] args) {
//		int arr[] = { 3, 9, -1, 10, -2 };

//		System.out.println("排序前");
//		System.out.println(Arrays.toString(arr));

		// 为了容量理解,我们把冒泡排序的演变过程,给大家展示

		// 测试冒泡排序的速度O(n^2),给80000个数据,测试
		// 创建要给80000个随机的数组
		int[] arr = new int[80000];
		for (int i = 0; i < 80000; i++) {
			arr[i] = (int) (Math.random() * 80000);// 生成一个【0,80000】数
		}

		Date date1 = new Date();
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String date1Str = simpleDateFormat.format(date1);
		System.out.println("排序前的时间是" + date1Str);
		bubbleSort(arr);

		Date date2 = new Date();
		String date2Str = simpleDateFormat.format(date2);
		System.out.println("排序后的时间是" + date2Str);

//		System.out.println("排序后");
//		System.out.println(Arrays.toString(arr));

		/*
		 * // 第二趟排序,就是将第二大的数排在倒数第二位 for (int j = 0; j < arr.length - 1 - 1; j++) { //
		 * 如果前面的数比后面的数大,则交换 if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j +
		 * 1]; arr[j + 1] = temp; } } System.out.println("第二趟排序后的数组");
		 * System.out.println(Arrays.toString(arr));
		 * 
		 * // 第三趟排序,就是将第三大的数排在倒数第三位 for (int j = 0; j < arr.length - 1 - 2; j++) { //
		 * 如果前面的数比后面的数大,则交换 if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j +
		 * 1]; arr[j + 1] = temp; } } System.out.println("第三趟排序后的数组");
		 * System.out.println(Arrays.toString(arr));
		 * 
		 * // 第四趟排序,就是将第 4 大的数排在倒数第 4 位 for (int j = 0; j < arr.length - 1 - 3; j++) {
		 * // 如果前面的数比后面的数大,则交换 if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j
		 * + 1]; arr[j + 1] = temp; } } System.out.println("第四趟排序后的数组");
		 * System.out.println(Arrays.toString(arr));
		 */
	}

	// 将前面的冒泡排序算法,封装成一个方法
	public static void bubbleSort(int[] arr) {
		// 冒泡排序的时间复杂度 O(n^2)
		int temp = 0; // 临时变量
		boolean flag = false; // 标识变量,表示是否进行交换
		for (int i = 0; i < arr.length - 1; i++) {

			for (int j = 0; j < arr.length - 1 - i; j++) {
				// 如果前面的数比后面的数大,则交换
				if (arr[j] > arr[j + 1]) {
					flag = true;
					temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
//			System.out.println("第" + (i + 1) + "趟排序后的数组");
//			System.out.println(Arrays.toString(arr));
			if (!flag) {// 在一趟排序中,一次交换都没发生过
				break;

			} else {
				flag = false;// 重置flag,进行下次判断
			}
		}
	}

}

到了这里,关于java冒泡排序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 七大排序算法——冒泡排序,通俗易懂的思路讲解与图解(完整Java代码)

    排序:所谓排序,就是使一串记录,按照其中的某个或某些的大小,递增或递减的排列起来的操作。 上述待排序的数中,有两个5。 将 前面 的5标记一个a, 将 后面 的5标记一个b。 通过算法进行排序后,这一组数就有序了, 但是要看两个相同的5的位置是否有改变。

    2024年02月16日
    浏览(29)
  • 【数据结构与算法】排序算法:冒泡排序,冒泡排序优化,选择排序、选择排序优化

    目录 一、冒泡排序 1、冒泡排序思想 2、冒泡排序算法的性能分析 代码实现: 二、选择排序 1、选择排序思想 2、选择排序算法的性能分析  代码实现: 1、冒泡排序思想 冒泡排序的基本思想是通过相邻元素之间的比较和交换来逐步将最大(或最小)的元素移到右边(或左边

    2024年01月19日
    浏览(39)
  • C++常见排序算法——冒泡排序算法

    首先说一下冒泡排序的基本算法思想: 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。 这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸

    2023年04月08日
    浏览(28)
  • 排序算法(1):冒泡排序

    (꒪ꇴ꒪ ),Hello我是 祐言QAQ 我的博客主页:C/C++语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍 快上🚘,一起学习,让我们成为一个强大的攻城狮! 送给自己和读者的一句鸡汤🤔: 集中起来的意志可以击穿顽石! 作者水平很有限,如果发现错误,请在评论区指

    2024年02月12日
    浏览(28)
  • 排序算法:冒泡排序

    冒泡排序是入门级的算法,但也有一些有趣的玩法。通常来说,冒泡排序有三种写法: 一边比较一边向后两两交换,将最大值 / 最小值冒泡到最后一位; 经过优化的写法:使用一个变量记录当前轮次的比较是否发生过交换,如果没有发生交换表示已经有序,不再继续排序;

    2024年02月11日
    浏览(34)
  • 排序:冒泡排序算法分析

    基于“交换”的排序︰ 根据序列中两个元素的比较结果来对换这两个记录在序列中的位置。 交换排序包括 冒泡排序 和 快速排序 。 1.算法原理 从后往前(或从前往后)两两比较相邻元素的值, 若为逆序(即 A [ i − 1 ] A [ i ] A[i-1]A[i] A [ i − 1 ] A [ i ] ) ,则交换它们,直到

    2024年02月07日
    浏览(32)
  • 排序算法之二:冒泡排序

    冒泡排序是交换排序 基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。 第一趟:将最大的值排到最后 第二趟:将次大的值排到倒

    2024年02月04日
    浏览(23)
  • 常见排序算法之冒泡排序

    顾得泉: 个人主页 个人专栏: 《Linux操作系统》  《C/C++》  《LeedCode刷题》 键盘敲烂,年薪百万!         冒泡排序,英文名Bubble Sort,是一种相对基础的 交换排序 方法。这种排序算法的名字来源于它操作的过程,可以类比为数列中的每一个元素都可以像小气泡一样

    2024年02月05日
    浏览(34)
  • 排序算法之冒泡排序(图解)

    冒泡排序 (英语: Bubble Sort )又称为 泡式排序 ,是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是

    2023年04月19日
    浏览(42)
  • 排序算法之详解冒泡排序

    冒泡排序顾名思义,就是像冒泡一样,泡泡在水里慢慢升上来,由小变大。 虽然冒泡排序和冒泡并不完全一样,但却可以帮助我们理解冒泡排序。 一组无序的数组,要求我们从小到大排列 我们可以先将最大的元素放在数组末尾 再将第二大的数放在数组的倒数第二个位置 再

    2023年04月25日
    浏览(82)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包