`

第二课 冒泡排序

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

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

相关推荐

    冒泡排序练习题1

    第一轮结束后,最大的元素52会移动到A[1]的位置,第二轮结束后,第二大的元素47会移动到A[2]的位置。因此,经过该程序段加工后,数组元素A[1]到A[6]的值依次为{47,52,39,15,21,6}。 2. 第二段代码段的逻辑稍显复杂...

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

    例如,在给定的数组 `[4, 5, 7, 1, 2, 3]` 排序时,第二趟排序结束后,数组已经完全有序,但是原算法还需要继续执行后续的遍历。通过添加标志变量的方式,可以在发现数组已有序时提前结束排序过程,从而提高效率。

    实验3 冒泡排序程序

    2. 如果第一个元素大于第二个元素,就交换它们的位置。 3. 对每一对相邻元素做同样的操作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是序列中的最大值。 4. 针对所有的元素重复以上的步骤,除了最后...

    js冒泡排序两种排序代码

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

    C语言冒泡排序PPT课件.pptx

    2. 然后比较第二个和第三个数据,仍将较小放到后一个位置。 3. 依此类推,直到比较第n-1和第n个数据。 4. 这样,就将待排序序列中的最大的一个放到了第n个数据,这个过程称为第一趟排序。 5. 下面对前N-1个数据重复...

    冒泡排序和选择排序_C语言_冒泡排序_选择排序_

    3. 重复第二步,直到所有元素均排序完毕。 在链表中实现这两种排序方法时,需要考虑链表节点的结构和指针操作。链表的特性使得我们不能像数组那样直接通过下标访问元素,而是需要通过指针来遍历和修改节点。因此,...

    读懂冒泡排序

    2. 第二遍遍历,比较并交换,数组变为[3, 4, 2, 5, 8](5被放到了倒数第二的位置) 3. 第三遍遍历,比较并交换,数组变为[3, 2, 4, 5, 8](4被放到了倒数第三的位置) 4. 第四遍遍历,比较并交换,数组变为[2, 3, 4,...

    冒泡排序 冒泡排序代码示例

    ##### 第二种实现方式 ```cpp void bubble_sort(int* d, int n) { int t; bool flag = true; for (int i = 1; i ; i++) { if (flag == false) return; flag = false; for (int j = n - 1; j &gt;= i; j--) { if ...

    c语言二维数组冒泡排序

    例如,你可以先按照第一列排序,然后再对每一行的子序列按照第二列排序,以此类推。这将涉及到嵌套排序的实现,需要更复杂的代码来处理。 在实际应用中,冒泡排序效率较低,一般适用于小规模数据或教学演示。对于大...

    冒泡排序基本思想和算法冒泡排序基本思想和算法.

    冒泡排序的算法可以分为三个部分:初始、第一趟扫描和第二趟扫描。 1. 初始:将被排序的记录数组 R[1..n] 垂直排列,每个记录 R[i] 看作是重量为 R[i].key 的气泡。 2. 第一趟扫描:从下往上扫描数组 R,凡扫描到...

    冒泡排序运行结果

    3. **平均时间复杂度**:在大多数情况下,冒泡排序的时间复杂度为O(n^2),这使得它在大数据量排序时效率较低。 #### 四、冒泡排序的空间复杂度分析 冒泡排序是一种原地排序算法,它不需要额外的存储空间,因此空间...

    冒泡排序和快速排序的时间性能

    第二步是重复第一步直到整个数组都已经排序。 快速排序是一种高效的排序算法,其时间复杂度为O(n log n),其中n是要排序的元素个数。快速排序的基本思想是选择一个pivot元素,然后将数组分为两个部分:小于pivot的...

    冒泡排序 算法(冒泡,选择,插入,数组排序)

    i++)`从第二个元素开始,因为第一个元素默认认为已排序。内层循环`for (int j = i; (j &gt; 0) && (a[j] [j - 1]); j--)`用于找到合适的位置将当前元素插入,保持前面的元素都是已排序的。 最后,代码还使用了Java...

    C语言排序算法---冒泡排序法

    在实际应用中,冒泡排序效率较低,时间复杂度为O(n^2),对于大数据量或性能要求高的场景,通常会选择其他更高效的排序算法,如快速排序、归并排序或堆排序等。然而,由于其简单易懂,冒泡排序在教学和理解排序算法...

    Java冒泡排序算法

    如果第一个比第二个大,就交换它们两个。对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的...

    冒泡排序MFC实现

    2. **冒泡排序算法**:实现冒泡排序的关键在于理解其核心逻辑。冒泡排序通过两两比较相邻元素,如果前一个元素大于后一个,则交换它们的位置。这个过程会从第一个元素开始,到最后一个元素结束,然后再从头开始,...

    冒泡排序、选择排序、插入排序

    冒泡排序、选择排序和插入排序是三种基本的排序算法,它们都是在计算机科学中用于组织数据的关键技术。这些算法的实现通常用作教学示例,帮助初学者理解排序过程和时间复杂性。 **冒泡排序(Bubble Sort)**: 冒泡...

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

    - 在实际应用中,冒泡排序的时间复杂度较高(O(n^2)),在大数据量的情况下效率较低,可以考虑使用更高效的排序算法如快速排序或归并排序等。 以上是对“数据结构中的冒泡排序以及输出每趟排序结果”这一知识点的...

    C#四种排序算法(冒泡排序)

    选择排序的思想是找到最小(或最大)的元素,与第一个元素交换位置,然后在剩余元素中找最小的元素与第二个元素交换,以此类推。`SelectionSorter`类实现了选择排序,它使用两个嵌套循环,外层循环遍历所有元素,内...

    java GUI 实现冒泡排序

    冒泡排序是一种基础的排序算法,它通过重复遍历待排序的序列,比较相邻元素并交换位置,使得每个元素都能“浮”到它应该在的位置上。在这个Java GUI实现的冒泡排序项目中,我们利用了NetBeans工具来设计用户界面,使...

Global site tag (gtag.js) - Google Analytics