冒泡排序(Bubble Sorting)
基本介绍 时间复杂度O(n^2)
冒泡排序(Bubble Sorting)的基本思想是:通过对待 排序序列从前向后(从下标较小的元素开始),依次比较 相邻元素的值,若发现逆序则交换,使值较大 的元素逐渐从前移向后部,就象水底下的气泡一样逐渐 向上冒。因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下 来没有进行过交换,就说明序列有序,因此要在排序过程中设置 一个标志flag判断元素是否进行过交换。从而减少不必要的比较。

package com.diyo.sort; import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date; /**
* BubbleSort冒泡排序 时间复杂度O(n^2)
*
* @author DengZY
*
*/
public class BubbleSort { public static void main(String[] args) { int arr[] = { 3, 9, -1, 10, -2 }; // 测试冒牌排序的速度O(n^2),给80000个数据测试
// int[] arr2 = new int[80000];
// for (int i = 0; i < 80000; i++) {
// arr2[i] = (int) (Math.random() * 999999); // 生成一个[0,999999)的数
// } // Date date1 = new Date();
// SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// String date1Str = simpleDateFormat.format(date1);
// System.out.println("排序前的时间是="+date1Str); System.out.println("-----排序前-----");
System.out.println(Arrays.toString(arr)); System.out.println("-----开始排序-----");
bubbleSort(arr);
System.out.println("-----结束排序-----"); System.out.println("-----排序后-----");
System.out.println(Arrays.toString(arr)); // Date date2 = new Date();
// String date2Str =simpleDateFormat.format(date2);
// System.out.println("排序后的时间是="+date2Str); /*
* // 第一趟排序,将第一大的数排在倒数第一位
for (int j = 0; j < arr.length - 1 - 0; 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));
*
* // 第四趟排序,将第四大的数排在倒数第四位 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) {
int temp = 0; // 临时变量,用于交换
boolean flag = false; // 标识变量,表示是否进行过交换,用于减少重复排序次数
for (int i = 0; i < arr.length - 1; i++) {
// 第(i+1)趟排序,将最大的数排在最后
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,进行下次判断
}
}
}
}
(1)一共进行 数组的大小 -1 次 大循环
(2)每一次排序的次数在逐渐的减少
(3)如果我们发现在某趟排序中,没有发生一次交换,可以提前结束排序。
冒泡排序(Bubble Sorting)的更多相关文章
- Java中的经典算法之冒泡排序(Bubble Sort)
Java中的经典算法之冒泡排序(Bubble Sort) 神话丿小王子的博客主页 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一 ...
- java排序算法之冒泡排序(Bubble Sort)
java排序算法之冒泡排序(Bubble Sort) 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数 ...
- 排序算法--冒泡排序(Bubble Sort)_C#程序实现
排序算法--冒泡排序(Bubble Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来非常困 ...
- 【排序算法】冒泡排序(Bubble Sort)
0. 说明 参考 维基百科中的冒泡排序 冒泡排序 (Bubble Sort) 是与插入排序拥有相等的执行时间,但是两种算法在需要的交换次数却很大地不同. 在最坏的情况,冒泡排序需要 O(n2) 次交 ...
- 冒泡排序(Bubble Sort),比较次数优化改进
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- 冒泡排序(Bubble Sort)
常见的排序算法有Bubble Sort.Merge Sort.Quick Sort 等,所有排序算的基本法思想都是把一个无限大的数据规模通过算法一步步缩小,指导最后完成排序. 这里分享一下Buuble ...
- [算法] 冒泡排序 Bubble Sort
冒泡排序(Bubble Sort,台湾另外一种译名为:泡沫排序)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没 ...
- 算法之经典排序-冒泡排序(bubble sort)
冒泡排序 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成. 这个算法的名字由来是因为越大的元 ...
- 经典排序算法 - 冒泡排序Bubble sort
原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子 例子 ...
随机推荐
- python 99乘法表
先把代码贴上 for i in range(1,10): for j in range(1,i+1): s="%d X %d = %d"%(j,i,i*j) print(s,end ...
- 扫描PDF417崩溃的原因找到:手机摄像头分辨率低
换孩子姥姥华为手机解决了. 能扫pdf417码了
- lua 表
最近在尝试配置 awesome WM,因此粗略地学习了一下 lua . 在学习过程中,我完全被表表在 lua 中的应用所镇住了. 表在 lua 中真的是无处不在:首先,它可以作为字典和数组来用:此外, ...
- defineProperty 和Proxy双向绑定演示,你还不知道么?
双向绑定,也就是说js中的数据传到页面,页面中的内容到js,实现同步更新,简单的演示可以直接复制下放HTML代码运行. 在这个例子中,我们使用defineProperty ,Object.define ...
- P1359租用游艇(dp+dfs)
好久真的是好久没有做dp的问题了(QWQ)(我有学过这玩意???) 诶,人生呐! 今天来一个动归- 顺便可以回顾一下dfs. 这个题我觉得审题也非常重要 小可爱dp: #include <bit ...
- Python os.removedirs() 方法
概述 os.removedirs() 方法用于递归删除目录.像rmdir(), 如果子文件夹成功删除, removedirs()才尝试它们的父文件夹,直到抛出一个error(它基本上被忽略,因为它一般 ...
- PHP filesize() 函数
定义和用法 filesize() 函数返回指定文件的大小. 如果成功,该函数返回文件大小的字节数.如果失败,则返回 FALSE. 语法 filesize(filename) 参数 描述 filenam ...
- 关于随机数 C++
void test() { srand();//这里设置了 说明又得从头开始循环一次了 //如果没有设置 它还是基于main函数里的srand(1) for(int i=;i<;i++) { c ...
- Python爬取网站上面的数据很简单,但是如何爬取APP上面的数据呢
- lombok的基本使用方法
在java刚开始学习的时候,首先就会学习封装.继承和多态,就拿封装来说,封装就是为了保护数据安全而将实体类内部数据保持为私有状态,如果外部程序想要访问里面的数据就必须调用此实体类提供的相关数据接口,这 ...