`

第二课 冒泡排序

阅读更多
引用
笔记--冒泡排序

1.冒泡排序类
package com.flysnow.chap03;

/**
 * 冒泡排序
 * @author 飞雪无情
 * @since:2010-3-25
 */
public class ArrayBub {
	private long[] a;
	private int nElems;
	public ArrayBub(int max){
		a=new long[max];
		nElems=0;
	}
	/**
	 * 插入元素
	 * @param value
	 */
	public void insert(long value){
		a[nElems]=value;
		nElems++;
	}
	/**
	 * 打印元素
	 */
	public void display(){
		for(int i=0;i<nElems;i++){
			System.out.print(a[i]+" ");
		}
		System.out.println();
	}
	/**
	 * 冒泡排序
	 */
	public void bubbleSort(){//性能O(N^2)
		for(int out=nElems-1;out>0;out--){//外循环,控制趟数
			for(int in=0;in<out;in++){//内循环,控制一趟比较次数
				if(a[in]>a[in+1]){//交换位置
					swap(in,in+1);
				}
			}
		}
	}
	/**
	 * 交换
	 * @param one 数组索引
	 * @param two 数组索引
	 */
	private void swap(int one, int two) {
		long temp=a[one];
		a[one]=a[two];
		a[two]=temp;
	}
}

2.冒泡排序测试
package com.flysnow.chap03;

import java.util.Random;

/**
 * 冒泡排序测试
 * @author 飞雪无情
 * @since:2010-3-25
 */
public class BubbleSortApp {
	public static void main(String[] args){
		ArrayBub bub=new ArrayBub(100);
		Random random=new Random();
		for(int i=0;i<10;i++){//添加10个随机数
			bub.insert((long)(random.nextFloat()*100));
		}
		bub.display();//未排序
		bub.bubbleSort();//排序
		bub.display();//排序后
	}
}


3.总结
算法思想:
  • 第一趟,从队列的最左边开始,比较0号和1号的数据,如果0号的数据大于1号的,则交换位置,否则什么都不做。然后右移一个位置,比较1号和2号的数据,和刚才一样,一次类推走完第一趟。
  • 第二趟,也是从最左边开始,比较0号和1号数据。。。一直到n-1号数据
  • ........
  • 直到比较到0号数据.


  • 描述: 冒泡排序
  • 大小: 17.4 KB
分享到:
评论
4 楼 飞雪无情 2010-04-12  
zhangshixi 写道
飞雪无情 写道
zhangshixi 写道
这个算法是在Java数据结构和算法书上的吧?其中下面的外层循环条件有误,当对有序的数组进行反方向排序时,会出现最后两个数据项的排列错误。
# public void bubbleSort(){//性能O(N^2) 
#         for(int out=nElems-1;out>1;out--){//外循环,控制趟数 
#             for(int in=0;in<out;in++){//内循环,控制一趟比较次数 
#                 if(a[in]>a[in+1]){//交换位置 
#                     swap(in,in+1); 
#                 } 
#             } 
#         } 
#     } 
应改为out>=1或者out>0

嗯。。我测试了,对于有序数组时反向时的确存在问题,因为少比较了一趟。

恩,呵呵~我也是测试出来的。希望共同学习。


嗯。对于有序数组反序是冒泡排序最糟糕的情况,也是性能最差的情况,因为需要循环n-1趟,针对这种情况冒泡排序已经不合适了,用栈最好。。压进去,弹出来。正好反序。性能O(1)..
3 楼 zhangshixi 2010-04-12  
飞雪无情 写道
zhangshixi 写道
这个算法是在Java数据结构和算法书上的吧?其中下面的外层循环条件有误,当对有序的数组进行反方向排序时,会出现最后两个数据项的排列错误。
# public void bubbleSort(){//性能O(N^2) 
#         for(int out=nElems-1;out>1;out--){//外循环,控制趟数 
#             for(int in=0;in<out;in++){//内循环,控制一趟比较次数 
#                 if(a[in]>a[in+1]){//交换位置 
#                     swap(in,in+1); 
#                 } 
#             } 
#         } 
#     } 
应改为out>=1或者out>0

嗯。。我测试了,对于有序数组时反向时的确存在问题,因为少比较了一趟。

恩,呵呵~我也是测试出来的。希望共同学习。
2 楼 飞雪无情 2010-04-12  
zhangshixi 写道
这个算法是在Java数据结构和算法书上的吧?其中下面的外层循环条件有误,当对有序的数组进行反方向排序时,会出现最后两个数据项的排列错误。
# public void bubbleSort(){//性能O(N^2) 
#         for(int out=nElems-1;out>1;out--){//外循环,控制趟数 
#             for(int in=0;in<out;in++){//内循环,控制一趟比较次数 
#                 if(a[in]>a[in+1]){//交换位置 
#                     swap(in,in+1); 
#                 } 
#             } 
#         } 
#     } 
应改为out>=1或者out>0

嗯。。我测试了,对于有序数组时反向时的确存在问题,因为少比较了一趟。
1 楼 zhangshixi 2010-04-12  
这个算法是在Java数据结构和算法书上的吧?其中下面的外层循环条件有误,当对有序的数组进行反方向排序时,会出现最后两个数据项的排列错误。
# public void bubbleSort(){//性能O(N^2) 
#         for(int out=nElems-1;out>1;out--){//外循环,控制趟数 
#             for(int in=0;in<out;in++){//内循环,控制一趟比较次数 
#                 if(a[in]>a[in+1]){//交换位置 
#                     swap(in,in+1); 
#                 } 
#             } 
#         } 
#     } 
应改为out>=1或者out>0

相关推荐

    js冒泡排序两种排序代码

    js冒泡排序,冒泡排序的工作原理,我们有一个未排序的数组arr = [ 1, 4, 2, 5, -2, 3 ]任务是使用冒泡排序对数组进行排序。 冒泡排序比较索引 0 中的元素,如果第 0 索引大于第 1 索引,则交换值,如果第 0 索引...

    冒泡排序-排序过程 冒泡排序-排序过程

    比如用冒泡排序将4、5、7、1、2、3这6个数排序。在该列中,第二趟排序结束后,数组已排好序,但计算机此时并不知道已经反排好序,计算机还需要进行一趟比较,如果这一趟比较,未发生任何数据交换,则知道已排序好,...

    实验3 冒泡排序程序

    实验3 冒泡排序程序

    java算法——冒泡排序

    * 冒泡排序: * 每次在无序队列里将相邻两个数一次进行比较, * 将小数调到前面,逐次比较,直至将最大的数移到 * 最后。将剩下的N-1个数继续比较,将次大数移至 * 倒数第二位。

    数据结构 冒泡排序 输出每一趟结果

    用函数实现冒泡排序,并输出每趟排序的结果(要求当一趟冒泡过程中不再有数据交换,则排序结束) Input 第一行:键盘输入待排序关键的个数n 第二行:输入n个待排序关键字,用空格分隔数据 Output 每行输出每趟排序...

    Java排序之冒泡排序

    重复以上过程,仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到最大数前的一对相邻数,将小数放前,大数放后,第二趟结束,在倒数第二...

    asp.net 冒泡排序

    重复以上过程,仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到最大数前的一对相邻数,将小数放前,大数放后,第二趟结束,在倒数第二...

    java基础 经典算法之冒泡排序详解

    1.冒泡排序的原理:每次都从第一个元素开始(索引0),向后两两比较,只要后面的比前面的大,就交换(从大到小) 2.通过画图分析,5个数字排4趟,n数字排n-1趟,而外层的for循环代表的是循环的趟数,所以外层循环的结束条件是...

    冒泡排序法

    冒泡排序,是指计算机的一种排序方法,它的时间复杂度为O(n^2),虽然不及堆排序、快速...冒泡排序是经过n-1趟子排序完成的,第i趟子排序从第1个数至第n-i个数,若第i个数比后一个数大(则升序,小则降序)则交换两数

    用LabVIEW编写冒泡排序

    在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的...

    Java冒泡排序代码

    //测试冒泡排序 /********************* * int[] num = {23,45,76,78,98,54,}; 第一次 23 45 76 78 54 98 第二次 23 45 76 54 78 98 第三次 23 45 54 76 78 98 输出 :23 45 54 76 78 98 当判断为正确时就退出...

    C语言排序算法冒泡排序

    时间复杂度:冒泡排序的时间复杂度为O(n^2),其中n是待排序序列的长度。这是因为冒泡排序需要进行多轮遍历,并且每一轮遍历都需要比较和交换相邻元素。 稳定性:冒泡排序是一种稳定的排序算法,即相等元素的顺序在...

    c#编写的冒泡排序法则

    冒泡排序是数据结构中的一种排序法则,他是比较相邻两数的大小,如果第一个数大于第二个数则交换位置,再用第二个数去比较第三个数,以此类推

    C例子:冒泡排序

    该程序是我写的博客“一起talk C栗子吧(第二十六回:C语言实例--冒泡排序)”的配套程序,共享给大家使用

    冒泡排序的基本概念冒泡排序的基本概念是:依次比较相邻的两个数,将大数放在前面,小数放在后面。即首先比较第1个和第2个数,将大数放前,小数放后。然后比较第2个数和第3个数,将大数放前,小数放后,如此继续,直至比较最后两个数,将大数放前,小数放后,此时第一趟结束

    冒泡排序的基本概念是:依次比较相邻的两个数,将大数放在前面,小数放在后面。即首先比较第1个和第2个数,将大数放前,小数放后。然后比较第2个数和第3个数,将大数放前,小数放后,如此继续,直至比较最后两个数,...

    嵌入式开发之冒泡排序

    arm汇编之冒泡排序 嵌入式开发 AREA Sort,CODE,READONLY :首先用AREA伪代码加上CODE,表明下面引出的将是一个代码段(于此相对的还有数据段DATA),ENTRY 和END成对出现,说明他们之间的代码是程序的主体 ENTRY:...

    C#文档冒泡排序,值传递与址传递

    冒泡排序,值传递与址传递,适合初学C#基础的人练习的例子

    汇编语言冒泡排序

    原数顺序 第1轮第1次 第1轮第2次 第1轮第3次 第2轮第1次 第2轮第2次 第3轮第1次 8 2 2 2 2 2 2 2 8 5 5 5 4 4 5 5 8 4 4 5 5 4 4 4 8 8 8 8 N个数,共N-1轮,第i轮要比较N-i次,每轮设立交换标志。

    PTA字符串冒泡排序(C语言版)

    7-3 字符串的冒泡排序 (20分) 我们已经知道了将N个整数按从小到...输出冒泡排序法扫描完第K遍后的中间结果序列,每行包含一个字符串。 输入样例: 6 2 best cat east a free day 输出样例: best a cat day east free

    javascript冒泡排序源代码

    直接运行html 文件即可,第一个文本框为要排序的数字,第二位为排序后的现实的地方

Global site tag (gtag.js) - Google Analytics