冒泡排序java代码详解(java中冒泡排序算法的详细解答以及程序)

本文目录
java中冒泡排序算法的详细解答以及程序
实例说明
用冒泡排序方法对数组进行排序。
实例解析
交换排序的基本思想是两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。
应用交换排序基本思想的主要排序方法有冒泡排序和快速排序。
冒泡排序
将被排序的记录数组 R.key 的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组 R 。凡扫描到违反本原则的轻气泡,就使其向上“漂浮”。如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。
(1) 初始, R 为无序区。
(2) 第一趟扫描,从无序区底部向上依次比较相邻的两个气泡的重量,若发现轻者在下、重者在上,则交换二者的位置。即依次比较 (R 的内容。
第一趟扫描完毕时,“最轻”的气泡就飘浮到该区间的顶部,即关键字最小的记录被放在最高位置 R 上。
(3) 第二趟扫描,扫描 R。
注意:第 i 趟扫描时, R 变为新的有序区。
冒泡排序算法
因为每一趟排序都使有序区增加了一个气泡,在经过 n-1 趟排序之后,有序区中就有 n-1 个气泡,而无序区中气泡的重量总是大于等于有序区中气泡的重量,所以整个冒泡排序过程至多需要进行 n-1 趟排序。
若在某一趟排序中未发现气泡位置的交换,则说明待排序的无序区中所有气泡均满足轻者在上,重者在下的原则,因此,冒泡排序过程可在此趟排序后终止。为此,在下面给出的算法中,引入一个布尔量 exchange, 在每趟排序开始前,先将其置为 FALSE 。若排序过程中发生了交换,则将其置为 TRUE 。各趟排序结束时检查 exchange, 若未曾发生过交换则终止算法,不再进行下趟排序。
具体算法如下:
void BubbleSort(SeqList R){
//R(1..n) 是待排序的文件,采用自下向上扫描,对 R 做冒泡排序
int i,j;
Boolean exchange; // 交换标志
for(i=1;i《n;i++){ // 最多做 n-1 趟排序
exchange=FALSE; // 本趟排序开始前,交换标志应为假
for(j=n-1;j》=i;j--) // 对当前无序区 R 自下向上扫描
if(R.key){ // 交换记录
R 不是哨兵,仅做暂存单元
R;
R;
exchange=TRUE; // 发生了交换,故将交换标志置为真
}
if(!exchange) // 本趟排序未发生交换,提前终止算法
return;
} //endfor( 外循环 )
}//BubbleSort
public class BubbleSort {
public static void main(String args) {
// TODO Auto-generated method stub
List《Integer》 lstInteger = new ArrayList《Integer》();
lstInteger.add(1);
lstInteger.add(1);
lstInteger.add(3);
lstInteger.add(2);
lstInteger.add(1);
for(int i = 0; i《lstInteger.size(); i++){
System.out.println(lstInteger.get(i));
}
System.out.println("排序之后-----------------");
lstInteger = sortList(lstInteger);
for(int i = 0; i《lstInteger.size(); i++){
System.out.println(lstInteger.get(i));
}
}
public static List《Integer》 sortList(List《Integer》 lstInteger){
int i,j,m;
boolean blChange;
int n = lstInteger.size();
for(i=0;i《n;i++){
blChange = false;
for(j = n-1; j》i ; j-- ){
if(lstInteger.get(j)《lstInteger.get(j-1)){
m = lstInteger.get(j-1);
lstInteger.set(j-1, lstInteger.get(j));
lstInteger.set(j, m);
blChange = true;
}
}
if(!blChange){
return lstInteger;
}
}
return lstInteger;
}
}
归纳注释
算法的最好时间复杂度: 若文件的初始状态是正序的, 一趟扫描即可完成排序。所需的关键字比较次数 C 和记录移动次数 M 均达到最小值,即 C(min)=n-1, M(min)= 0 。冒泡排序最好的时间复杂度为 O(n)。
算法的最坏时间复杂度: 若初始文件是反序的,需要进行 n-1 趟排序。每趟排序要进行 n-1 次关键字的比较 (1《=i《=n-1), 且每次比较都必须移动记录 3 次。在这种情况下,比较和移动次数均达到最大值,即 C(max)=n(n-1)/2=O(n ^2 ),M(max)=3n(n-1)/2=O(n ^2 )。冒泡排序的最坏时间复杂度为 O(n^2 )。
算法的平均时间复杂度为 O(n^2 )。虽然冒泡排序不一定要进行 n-1 趟,但由于它的记录移动次数较多,故平均时间性能比直接插入排序要差得多。
算法稳定性:冒泡排序是就地排序,且它是稳定的。
算法改进:上述的冒泡排序还可做如下的改进,① 记住最后一次交换发生位置 lastExchange 的冒泡排序( 该位置之前的相邻记录均已有序 )。下一趟排序开始时,R 的位置,其余的气泡均已排好序时,则仍需做 n-1 趟扫描才能完成排序。比如对初始关键字序列:94、10、12、18、42、44、45、67 就需 7 趟扫描。造成不对称性的原因是每趟扫描仅能使最重气泡“下沉”一个位置,因此使位于顶端的最重气泡下沉到底部时,需做 n-1 趟扫描。在排序过程中交替改变扫描方向,可改进不对称性
谁能详细的解释下JAVA中的冒泡排序 谢谢- .-
int array{9,2,3,1,0,5,8,4,7,6};//初始化一个数组,长度为10
int temp;//定义一个临时变量,
System.out.println("原有数组内容:");//输出这几个汉字
printArray(array);//调用printArray方法,并将前面初始化的数组作为参数传递给该方法
for(int i =1;i《array.length;i++){//这里应该是算法的核心了,但是如果想理解,还是先看看内层的循环,
for(int j =0;j《array.length-i;j++){//循环了0到数组长度10-1 一共10次
if(array做比较,如果大于,第2个元素
temp=array的值赋值给临时变量
array
array
//看懂这里了吗?如果前面的数,或者形象点a,..依次往上排,那么就是如果排在下面的数组元素的值大于上面的数组元素的值那么就将这两个元素的位置换一下,大的放上面,也就是排在数组的后面,像不像冒泡,水中的气泡,越到上面越大;如果小的话当然就没关系了,还是小的在下面
}
//这一次内层循环做完之后,保证了最下面的气泡(数组元素的位置),它跟后面所有的元素都做了一次比较,如果它最大就能排到最上面
}
//最外层的循环保证了,从头到尾将所有的数组元素按照从前到后,或者从下到上的顺序都与后面的元素比较了一次,这就完成了所有元素的排序
}
System.out.println("从小到大排序后的结果:");
printArray(array);
}
private static void printArray(int array) {//来看看,这个方法做了什么,在上面调用这个方法的时候已经将你初始化的那个长度为10的数组做为参数传递了进来
// TODO Auto-generated method stub
for(int i : array){//用增强for循环,遍历这个数组
System.out.print(i+" ");//一次打印i的值和空格
}
System.out.println("\n");//都遍历结束后,换行
}
输入内容已经达到长度限制
还能输入 9999 字
希望你满意,遇到问题多多分析!
java冒泡排序详细讲解
依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。
由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。
for(int
j=0;j《=len-i-1;j++),冒泡排序比较相邻的值,也就是a相比较
所以这段代码从a小于
a时,也就比到了最后一个数组了。上层循环就是控制数组比较的长度。
求冒泡排序Java的Demo.要有注释,越详细越好
public class BubbleSort{
public static void main(String args){
int score = {67, 69, 75, 87, 89, 90, 99, 100};
for (int i = 0; i 《 score.length -1; i++){ //最多做n-1趟排序
for(int j = 0 ;j 《 score.length - i - 1; j++){ //对当前无序区间score进行排序(j的范围很关键,这个范围是在逐步缩小的)
if(score){ //把小的值交换到后面
int temp = score;
score;
score = temp;
}
}
System.out.print("第" + (i + 1) + "次排序结果:");
for(int a = 0; a 《 score.length; a++){
System.out.print(score + "\t");
}
System.out.println("");
}
System.out.print("最终排序结果:");
for(int a = 0; a 《 score.length; a++){
System.out.print(score + "\t");
}
}
}
冒泡排序法java
***隐藏网址***
public class Main extends Object {
public static void main(String data = {6,5,9,7,2,8};
System.out.println("冒泡排序法: ");
System.out.println("原始数据为: "); //遍历数组
for(int i = 0; i 《 data.length; i++) {
System.out.print(data + " ");
}
System.out.print("\n"); //冒泡排序
bubbleSort(data);
}
public static void bubbleSort(intdata) { //temp用于数组元素交换
int temp; //i记录扫描次数
for(int i = data.length - 1; i 》 0; i--) { //进行这一轮的冒泡排序
for(int j = 0; j 《 i; j++) { //从第一个元素开始和下一个比较,比下一个大则交换
if(data) {
temp = data;
data;
data = temp;
}
}
}
System.out.print("排序结果为: "); //输出排序后的结果
for(int k = 0; k 《 data.length; k++) {
System.out.print(data + " ");
}
System.out.print("\n");
}
}

更多文章:
数据库管理系统和数据库系统分别侧重(数据库,数据库管理系统,数据库系统,这三个分别是什么意思并举个实例)
2026年9月7日 17:00
springmvc的依赖(springMVC的注入方式有哪几种,这与springMVC依赖)
2026年9月7日 14:00
display flex 自动换行(overflow-y:hidden;overflow-x:auto;无效解决方法)
2026年9月7日 11:00
timestamp without time zone(Postgresql中to_date()函数使用问题)
2026年9月7日 09:40






