算法之冒泡排序
时间:2022-04-26
本文章向大家介绍算法之冒泡排序,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
冒泡排序算法需要遍历几次数组。每次遍历都要比较连续相邻的元素,如果某一对相邻元素是降序,则互换它们的值,否则,保持不变。由于较小的值像“气泡”一样逐渐浮想顶部,而较大的值沉向底部,所以叫冒泡排序。
冒泡排序的图解是:
总结一句话就是:连续比较相邻的元素,降序则呼唤。有n个数,共需要比较n-1趟,第i趟,需要比较n-i次。
BubbleSort.Java
public class BubbleSort {//时间复杂度O(n^2)
public static void display(int[] array){
for(int i=0;i<array.length;i++){
System.out.print(array[i]+"t");
}
System.out.println();
}
//冒泡排序
public static void bubbleSort(int[] list){
int n=list.length;
for(int i=1;i<n;i++){//总共比较n-1趟
for(int j=0;j<n-i;j++){//第i趟比较n-i次
if(list[j]>list[j+1]){
int temp;
temp=list[j];
list[j]=list[j+1];
list[j+1]=temp;
}
}
System.out.print("第"+(i)+"轮排序结果:");
display(list);
}
}
public static void main(String args[]){
int[] list={25,6,56,24,9,12,55};
System.out.println("冒泡排序前的list是:");
for(int i=0;i<list.length;i++){
System.out.print(list[i]+" ");
}
System.out.println();
bubbleSort(list);//进行冒泡排序
System.out.println();
System.out.println("冒泡排序后的list是:");
for(int i=0;i<list.length;i++){
System.out.print(list[i]+" ");
}
}
}
public class BubbleSort {//时间复杂度O(n^2)
public static void display(int[] array){
for(int i=0;i<array.length;i++){
System.out.print(array[i]+"t");
}
System.out.println();
}
//冒泡排序
public static void bubbleSort(int[] list){
int n=list.length;
for(int i=1;i<n;i++){//总共比较n-1趟
for(int j=0;j<n-i;j++){//第i趟比较n-i次
if(list[j]>list[j+1]){
int temp;
temp=list[j];
list[j]=list[j+1];
list[j+1]=temp;
}
}
System.out.print("第"+(i)+"轮排序结果:");
display(list);
}
}
public static void main(String args[]){
int[] list={25,6,56,24,9,12,55};
System.out.println("冒泡排序前的list是:");
for(int i=0;i<list.length;i++){
System.out.print(list[i]+" ");
}
System.out.println();
bubbleSort(list);//进行冒泡排序
System.out.println();
System.out.println("冒泡排序后的list是:");
for(int i=0;i<list.length;i++){
System.out.print(list[i]+" ");
}
}
}
算法分析:
最差的情况下,冒泡排序算法需要进行n-1次遍历。第一次遍历需要n-1次比较,第二次遍历需要n-2次比较,依次进行;因此比较总数为:
(n-1)+(n-2)+...+2+1=n(n-1)/2=O(n2)
冒泡排序的时间复杂度为O(n2)
冒泡算法的改进:
冒泡排序的效率比较低,所以我们要通过各种方法改进。在上例中,第四轮排序之后实际上整个数组已经是有序的了,最后两轮的比较没必要进行。
注意:如果某次遍历中没有发生交换,那么就不必进行下一次遍历,因为所有元素已经排好了。
BubbleImprovedSort.java
public class BubbleImprovedSort {
public static void display(int[] array){
for(int i=0;i<array.length;i++){
System.out.print(array[i]+"t");
}
System.out.println();
}
//冒泡排序
public static void bubbleSort(int[] list){
int n=list.length;
boolean NeedNextPass=true;
for(int i=1;i<n&&NeedNextPass;i++){//总共比较n-1趟,如果某趟遍历中没有交换,那么不需要下次遍历,因为元素以排好
NeedNextPass=false;
for(int j=0;j<n-i;j++){//第i趟比较n-i次
if(list[j]>list[j+1]){
int temp;
temp=list[j];
list[j]=list[j+1];
list[j+1]=temp;
NeedNextPass=true;
}
}
System.out.print("第"+(i)+"轮排序结果:");
display(list);
}
}
public static void main(String args[]){
int[] list={25,6,56,24,9,12,55};
System.out.println("改进的冒泡排序:");
System.out.println("排序前的list是:");
for(int i=0;i<list.length;i++){
System.out.print(list[i]+" ");
}
System.out.println();
bubbleSort(list);//进行冒泡排序
System.out.println();
System.out.println("排序后的list是:");
for(int i=0;i<list.length;i++){
System.out.print(list[i]+" ");
}
}
}
public class BubbleImprovedSort {
public static void display(int[] array){
for(int i=0;i<array.length;i++){
System.out.print(array[i]+"t");
}
System.out.println();
}
//冒泡排序
public static void bubbleSort(int[] list){
int n=list.length;
boolean NeedNextPass=true;
for(int i=1;i<n&&NeedNextPass;i++){//总共比较n-1趟,如果某趟遍历中没有交换,那么不需要下次遍历,因为元素以排好
NeedNextPass=false;
for(int j=0;j<n-i;j++){//第i趟比较n-i次
if(list[j]>list[j+1]){
int temp;
temp=list[j];
list[j]=list[j+1];
list[j+1]=temp;
NeedNextPass=true;
}
}
System.out.print("第"+(i)+"轮排序结果:");
display(list);
}
}
public static void main(String args[]){
int[] list={25,6,56,24,9,12,55};
System.out.println("改进的冒泡排序:");
System.out.println("排序前的list是:");
for(int i=0;i<list.length;i++){
System.out.print(list[i]+" ");
}
System.out.println();
bubbleSort(list);//进行冒泡排序
System.out.println();
System.out.println("排序后的list是:");
for(int i=0;i<list.length;i++){
System.out.print(list[i]+" ");
}
}
}
泛型冒泡排序:
例1:元素实现comparable接口。排序是字符串string,string实现了comparable接口
BubbleGenericTypeSort .java
<span style="font-size:24px;">public class BubbleGenericTypeSort {
//泛型冒泡排序,使用Comparable对元素进行排序
public static <E extends Comparable<E>> void bubbleGenericTypeSort(E[] list){
int n=list.length;
for(int i=1;i<n;i++){//总共比较n-1趟
for(int j=0;j<n-i;j++){//第i趟比较n-i次
if(list[j].compareTo(list[j+1])>0){
E temp;
temp=list[j];
list[j]=list[j+1];
list[j+1]=temp;
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
/*Integer[] list={2,1,56,34,9,6,55,20,37,22}; //泛型的Integer ,包装类都实现了Comparable接口
System.out.println("冒泡排序前的list是:");
for(int i=0;i<list.length;i++){
System.out.print(list[i]+" ");
}
bubbleGenericTypeSort(list);//进行冒泡排序
System.out.println();
System.out.println("冒泡排序后的list是:");
for(int i=0;i<list.length;i++){
System.out.print(list[i]+" ");
}*/
String[] list={"John","Mike","Jack","Bob","Zoo","Meache","Abrow","Richer"}; //泛型的String ,包装类都实现了Comparable接口
System.out.println("冒泡排序前的list是:");
for(int i=0;i<list.length;i++){
System.out.print(list[i]+" ");
}
bubbleGenericTypeSort(list);//进行冒泡排序
System.out.println();
System.out.println("冒泡排序后的list是:");
for(int i=0;i<list.length;i++){
System.out.print(list[i]+" ");
}
}
}
</span>
<span style="font-size:24px;">public class BubbleGenericTypeSort {
//泛型冒泡排序,使用Comparable对元素进行排序
public static <E extends Comparable<E>> void bubbleGenericTypeSort(E[] list){
int n=list.length;
for(int i=1;i<n;i++){//总共比较n-1趟
for(int j=0;j<n-i;j++){//第i趟比较n-i次
if(list[j].compareTo(list[j+1])>0){
E temp;
temp=list[j];
list[j]=list[j+1];
list[j+1]=temp;
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
/*Integer[] list={2,1,56,34,9,6,55,20,37,22}; //泛型的Integer ,包装类都实现了Comparable接口
System.out.println("冒泡排序前的list是:");
for(int i=0;i<list.length;i++){
System.out.print(list[i]+" ");
}
bubbleGenericTypeSort(list);//进行冒泡排序
System.out.println();
System.out.println("冒泡排序后的list是:");
for(int i=0;i<list.length;i++){
System.out.print(list[i]+" ");
}*/
String[] list={"John","Mike","Jack","Bob","Zoo","Meache","Abrow","Richer"}; //泛型的String ,包装类都实现了Comparable接口
System.out.println("冒泡排序前的list是:");
for(int i=0;i<list.length;i++){
System.out.print(list[i]+" ");
}
bubbleGenericTypeSort(list);//进行冒泡排序
System.out.println();
System.out.println("冒泡排序后的list是:");
for(int i=0;i<list.length;i++){
System.out.print(list[i]+" ");
}
}
}
</span>
例2.元素实现自定义的Comparator比较器接口
BubbleComparator.java
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class BubbleComparator {
public static <E> void bubbleComparatorSort(List<E> list,Comparator<? super E> comparator){//<? super E>是E的父类
int n=list.size();
for(int i=1;i<n;i++){//总共比较n-1趟
for(int j=0;j<n-i;j++){//第i趟比较n-i次
if(comparator.compare(list.get(j), list.get(j+1))==1){
E temp;
temp=list.get(j);
list.set(j, list.get(j+1));
list.set(j+1, temp);
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
List<GeometricObject> list=new ArrayList<GeometricObject>();
list.add(new Rectangle(4,5,"矩形4,5"));
list.add(new Circle(3,"圆3"));
list.add(new Square(3,"正方形3"));
list.add(new Rectangle(2,6,"矩形2,6"));
list.add(new Circle(4,"圆4"));
System.out.println("冒泡排序前的list是:");
for(int i=0;i<list.size();i++){
System.out.print(list.get(i).getName()+":"+list.get(i).getArea()+" ");
}
bubbleComparatorSort(list, new GeometricObjectComparator());//进行冒泡排序
System.out.println();
System.out.println("冒泡排序后的list是:");
for(int i=0;i<list.size();i++){
System.out.print(list.get(i).getName()+":"+list.get(i).getArea()+" ");
}
}
public static class GeometricObjectComparator implements Comparator<GeometricObject> {
GeometricObjectComparator(){}
@Override
public int compare(GeometricObject o1, GeometricObject o2) {
// TODO Auto-generated method stub
float area1=o1.getArea();
float area2=o2.getArea();
if(area1<area2){
return -1;
}
else if(area1==area2)
return 0;
else
return 1;
}
}
}
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class BubbleComparator {
public static <E> void bubbleComparatorSort(List<E> list,Comparator<? super E> comparator){//<? super E>是E的父类
int n=list.size();
for(int i=1;i<n;i++){//总共比较n-1趟
for(int j=0;j<n-i;j++){//第i趟比较n-i次
if(comparator.compare(list.get(j), list.get(j+1))==1){
E temp;
temp=list.get(j);
list.set(j, list.get(j+1));
list.set(j+1, temp);
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
List<GeometricObject> list=new ArrayList<GeometricObject>();
list.add(new Rectangle(4,5,"矩形4,5"));
list.add(new Circle(3,"圆3"));
list.add(new Square(3,"正方形3"));
list.add(new Rectangle(2,6,"矩形2,6"));
list.add(new Circle(4,"圆4"));
System.out.println("冒泡排序前的list是:");
for(int i=0;i<list.size();i++){
System.out.print(list.get(i).getName()+":"+list.get(i).getArea()+" ");
}
bubbleComparatorSort(list, new GeometricObjectComparator());//进行冒泡排序
System.out.println();
System.out.println("冒泡排序后的list是:");
for(int i=0;i<list.size();i++){
System.out.print(list.get(i).getName()+":"+list.get(i).getArea()+" ");
}
}
public static class GeometricObjectComparator implements Comparator<GeometricObject> {
GeometricObjectComparator(){}
@Override
public int compare(GeometricObject o1, GeometricObject o2) {
// TODO Auto-generated method stub
float area1=o1.getArea();
float area2=o2.getArea();
if(area1<area2){
return -1;
}
else if(area1==area2)
return 0;
else
return 1;
}
}
}
- 回溯法算法框架
- 手机支付每天限额500块钱?“我刷你”和“你刷我”限额不一样
- 原始UDP封包发送
- Elasticsearch——Rest API中的常用用法
- strlen函数,strcat函数,strcpy函数,strncpy函数,strcmp函数
- Elasticsearch——多索引的使用
- 路由跟踪技术
- 手把手教你编写Logstash插件
- ping 实现设计---ICMP
- Elasticsearch增删改查 之 —— mget多文档查询
- Elasticsearch 之 数据索引
- AngularJS 国际化——Angular-translate
- MFC中注释含义
- Elasticsearch Span Query跨度查询
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 如何友好的把Python和Bash结合在一起
- Android-MediaPlayer(2)加进度条和时间显示
- Android-MediaPlayer(3)加打碟旋转效果
- 解决This Gradle plugin requires a newer IDE able to request IDE model level 3. For Android Studio
- 你不就是加了 2 行代码,为什么要用 2 天?
- Android 使用ZXing生成带logo的二维码
- Resolved versions for app (26.1.0) and test app (27.1.1) differ.
- APP 引导页、欢迎页运用
- 管道与重定向、文件查找-Linux每日一练(7)
- 软件包管理、计划任务-Linux每日一练(8)
- AkShare-能源数据-碳排放-湖北
- AkShare-能源数据-碳排放-广州
- AkShare-股票数据-次新股
- 问与答87: 如何根据列表内容在文件夹中查找图片并复制到另一个文件夹中?
- Java反射是什么?看这篇绝对会了!