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
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Django(31)模板中常用的过滤器[通俗易懂]

    Django(31)模板中常用的过滤器[通俗易懂]模版常用过滤器在模版中,有时候需要对一些数据进行处理以后才能使用。一般在Python中我们是通过函数的形式来完成的。而在模版中,则是通过过滤器来实现的。过滤器使用的是|来使用。add将传进来的参

  • 更改PyCharm背景以及一些实用的小插件

    更改PyCharm背景以及一些实用的小插件更改PyCharm背景以及一些实用的小插件好嘛,是不是有的时候敲代码总是会无聊和犯困。是不是觉得背景总是太单调没有欲望。废话不多,上图这是我的界面,而你的界面呢?或者是这样?今天来教你们设置背景,不需要下载任何东西首先>>>>点开File–>Settings然后跳出来Settings界面>>>>点击Appearance&Behavior–>Appearance然后点击>>>

  • qt中connect函数信号写法_qt中connect函数用法

    qt中connect函数信号写法_qt中connect函数用法*.cpp//带参数的拉姆达表达式connect(this,&Widget::mySignal,[=](intcount){qDebug()<<count;});mySignal(123456);*.hsignals:voidmySignal(intcount);注意:要在pro文件中加上CONFIG+=C++11…

  • Xray扫描器[通俗易懂]

    Xray扫描器[通俗易懂]简介xray是一款可以使用HTTP/HTTPS代理进行被动扫描的安全工具,支持功能如下独立的URL扫描 基于HTTP的被动代理扫描,同时支持HTTPS SQL注入检测模块 命令注入检测模块 任意重定向检测模块 路径遍历模块Xray扫描器内置插件XSS漏洞检测(key:xss):利用语义分析的方式检测XSS漏洞 SQL注入检测(key:sqldet…

  • POTPLAYER视频播放器及相当教程_播放器播放器什么是播放器

    POTPLAYER视频播放器及相当教程_播放器播放器什么是播放器原文出自:www.hangge.com  转载自原文链接:http://www.hangge.com/blog/cache/detail_1461.html#一、MADVR介绍MADVR 是一款超强的视频插件,其配合高清播放软件,可以做到目前 PC 上播放高清视频的最强画质。 MADVR 这款视频渲染器比市面上大多数播放器自带的渲染器有着更精确的颜色处理,更高质量的图像缩放缩放、以及更低…

  • wlan、wifi、蜂窝、无线局域网的区别「建议收藏」

    wlan、wifi、蜂窝、无线局域网的区别「建议收藏」1、WLAN跟无线局域网是相同概念,WLAN是缩写。2、无线局域网,英文全名:WirelessLocalAreaNetworks;简写为:WLAN。它相当便利的数据传输系统,它利用射频(RadioFrequency;RF)的技术,使用电磁波取代旧式双绞铜线(Coaxial)所构成的局域网络,在空中进行通信连接,使得无线局域网络能利用简单的存取架构让用户透过它,达到信息随身化。3、Wi-Fi,中文名无线保真,是一种可以将个人电脑、手持设备(如iPad、手机)等终端以无线方式互相连接的技术

发表回复

您的电子邮箱地址不会被公开。

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