java冒泡排序代码_Java冒泡排序

java冒泡排序代码_Java冒泡排序一、冒泡排序:利用冒泡排序对数组进行排序二、基本概念:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2…

大家好,又见面了,我是你们的朋友全栈君。

b8bace3696ccae0e4adb89d9ac28e34d.png

11fe95a92715b7ed4bd18304b86c0ee8.png

一、冒泡排序:

利用冒泡排序对数组进行排序

二、基本概念:

依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。

3d28b2d25d3fafc86ba6d4a92919d77b.png

三、实现思路:

用二重循环实现,外循环变量设为i,内循环变量设为j。假如有n个数需要进行排序,则外循环重复n-1次,内循环依次重复n-1,n-2,…,1次。每次进行比较的两个元素都是与内循环j有关的,它们可以分别用a[j]和a[j+1]标识,i的值依次为1,2,…,n-1,对于每一个i,j的值依次为0,1,2,…n-i 。

设数组长度为N:

1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。

2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。

3.N=N-1,如果N不为0就重复前面二步,否则排序完成。

四、java代码实现:

package 冒泡排序;

import java.util.Arrays;

/**

* 冒泡排序

* @author chen

*

*/

public class BubbleSort {

public static void BubbleSort(int[] arr) {

int temp;//定义一个临时变量

for(int i=0;i<arr.length-1;i++){//冒泡趟数

for(int j=0;j<arr.length-i-1;j++){

if(arr[j+1]<arr[j]){

temp = arr[j];

arr[j] = arr[j+1];

arr[j+1] = temp;

}

}

}

}

public static void main(String[] args) {

int arr[] = new int[]{1,6,2,2,5};

BubbleSort.BubbleSort(arr);

System.out.println(Arrays.toString(arr));

}

}

五、性能分析:

若记录序列的初始状态为”正序”,则冒泡排序过程只需进行一趟排序,在排序过程中只需进行n-1次比较,且不移动记录;反之,若记录序列的初始状态为”逆序”,则需进行n(n-1)/2次比较和记录移动。因此冒泡排序总的时间复杂度为O(n*n)。

六、算法优化:

冒泡排序法存在的不足及改进方法:

第一,在排序过程中,执行完最后的排序后,虽然数据已全部排序完备,但程序无法判断是否完成排序,为了解决这一不足,可设置一个标志位flag,将其初始值设置为非0,表示被排序的表是一个无序的表,每一次排序开始前设置flag值为0,在进行数据交换时,修改flag为非0。在新一轮排序开始时,检查此标志,若此标志为0,表示上一次没有做过交换数据,则结束排序;否则进行排序;

package 冒泡排序;

import java.util.Arrays;

/**

* 冒泡排序改进版

* @author chen

*

*/

public class BubbleSort1 {

public static void BubbleSort(int[] arr) {

boolean flag = true;

while(flag){

int temp;//定义一个临时变量

for(int i=0;i<arr.length-1;i++){//冒泡趟数,n-1趟

for(int j=0;j<arr.length-i-1;j++){

if(arr[j+1]<arr[j]){

temp = arr[j];

arr[j] = arr[j+1];

arr[j+1] = temp;

flag = true;

}

}

if(!flag){

break;//若果没有发生交换,则退出循环

}

}

}

}

public static void main(String[] args) {

int arr[] = new int[]{1,6,2,2,5};

BubbleSort.BubbleSort(arr);

System.out.println(Arrays.toString(arr));

}

}

第二、在冒泡排序中,一趟扫描有可能无数据交换,也有可能有一次或多次数据交换,在传统的冒泡排序算法及近年来的一些改进的算法中,只记录一趟扫描有无数据交换的信息,对数据交换发生的位置信息则不予处理。为了充分利用这一信息,可以在一趟全局扫描中,对每一反序数据对进行局部冒泡排序处理,称之为局部冒泡排序。局部冒泡排序与冒泡排序算法具有相同的时间复杂度,并且在正序和逆序的情况下,所需的关键字的比较次数和移动次数完全相同。由于局部冒泡排序和冒泡排序的数据移动次数总是相同的,而局部冒泡排序所需关键字的比较次数常少于冒泡排序,这意味着局部冒泡排序很可能在平均比较次数上对冒泡排序有所改进,当比较次数较少的优点不足以抵消其程序复杂度所带来的额外开销,而当数据量较大时,局部冒泡排序的时间性能则明显优于冒泡排序。对于N个无序数据,我们在进行一趟冒泡排序时,如果第k个数据和第k+1个数据逆序,那么对第k+1个数据进行一趟向前的冒泡排序,使其移动到合适的位置,也就是说让前面k+1个数据调节为正序。因为这种冒泡法只对前k+1个数据冒泡处理,所以我们称它为——局部冒泡

0d4397144ef9b32cd02a381f188047b8.png
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/157182.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • [Nhibernate]sqlite数据库基本使用

    [Nhibernate]sqlite数据库基本使用

    2021年9月2日
    51
  • Spring中bean的生命周期(最详细)

    Spring中bean的生命周期(最详细)SpringBean的生命周期是Spring面试热点问题。SpringBean的生命周期指的是从一个普通的Java类变成Bean的过程,深知Spring源码的人都知道这个给面试官讲的话大可讲30分钟以上,如果你不没有学习过Spring的源码,可能就知道Aware接口和调用init方法这样的生命周期,所以这个问题既考察对Spring的微观了解,又考察对Spring的宏观认识,想要答好并不容易!本文希望能够从源码角度入手,帮助面试者彻底搞定SpringBean的生命周期。首先你要明白一点,Sp

    2022年7月15日
    11
  • WindowsAPI 之 CreatePipe、CreateProcess[通俗易懂]

    WindowsAPI 之 CreatePipe、CreateProcess[通俗易懂]MSDN介绍CreatePipeApipeisasectionofsharedmemorythatprocessesuseforcommunication.Theproce

    2022年7月1日
    17
  • AndroidSDK下载及安装

    AndroidSDK下载及安装一、下载:AndroidSDK包下载官网下载:DownloadAndroidSDK-free-latestversion 网盘下载:AndroidSDK百度网盘下载地址链接 下载地址https://www.androiddevtools.cn/二、安装AndroidSDKTools双击运行已下载的.exe安装包,自动检测JDK的安装环境注意:安装路径应避免选择中文或特殊字符路径三、下载安装AndroidSDKA…

    2022年7月15日
    41
  • windows dumpbin工具[通俗易懂]

    windows dumpbin工具[通俗易懂]一般情况下,我们需要查看一个DLL或EXE中的包含的函数或是依赖的函数之类的信息,可以使用VS自带的工具dumpbin;  可以直接在命令行下输入dumpbin就可以查看他的使用说明,如果未显示,可以先运行VS安装目录下的vcvarsall.bat来设置一下环境变量就可以了 [cpp] viewplaincopyMicro

    2022年6月19日
    67
  • 这几天收到了同学们提交的赛道设计图纸[通俗易懂]

     §01室外越野▲图1.1室外越野赛道▲图1.2室外越野赛道设计图纸 §02单车拉力▲图2.1单车拉力快车道 §03室内PVC赛道一、坡道1、背景布下的桥还有,这样的坡道比赛时可以用吗?本来是防止单车摔下来的。▲图3.1蓝布下的坡道回复:这是允许的。2、桥连着桥卓大大,这个可以么,桥接桥?▲图3.2连体桥回复:这是允许的。 §04相关问题一、环境改变卓大大好,,我们现在的场地上面

    2022年4月9日
    50

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号