冒泡排序算法

本文深入讲解了冒泡排序算法的工作原理,包括通过比较并交换相邻元素来实现排序的过程。详细阐述了冒泡排序的时间复杂度、空间复杂度及稳定性,并提供了具体的Java实现代码示例,演示了如何对无序和有序数组进行排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.sort;

/**
 * 冒泡排序算法
 * 比较相邻的元素,如果第一个比第二个大,就交换它们。
 * 对每一对相邻元素做同样的工作,从开始的第一对到结尾的最后一对,在这一点上,最后元素是最大的数。
 * 针对所有的元素重复以上的动作,除了最后一个元素。
 * 持续每次对越来越少的元素重复上面的动作,直到没有任何一对元素需要比较。
 * 
 *  时间复杂度
 * 平均情况:O(n2), 最好情况:O(n), 最坏情况:O(n2)
 * 
 * 空间复杂度
 * 辅助存储:O(1)
 * 
 * 稳定性:稳定
 */

public class BubbleSort{
	
	/**
	 * 
	* @Title: sort 
	* @Description: 假设数组长度为n,每完成一次大循环将最小的冒泡到上端,要完成所有元素排序,需要经过n次大循环,
	* 				小循环进行两两相邻元素对比,如果反序则交换位置,小循环从最后开始比较,次数逐次递减,
	* 				加入flag布尔变量改进冒泡算法,使其对有序数组的排序时间复杂度变为O(n)。
	*/
	public static void sort(Comparable[] a) {
		int compareNum = 0;
		int swapNum = 0;
		int size = a.length;
		boolean flag = true;
		
		for(int i=0; i<size && flag; i++) {      
			flag = false;
			for(int j=size-1; j>i; j--) {  
				System.out.println("compare num:" + (++compareNum));
				if(less(a[j], a[j-1])) {
					swap(a, j, j-1);
					flag = true;
					System.out.println("swap num:" + (++swapNum));
				}
			}
		}
	}
	
	public static void show(Comparable[] a) {
		for(int i=0; i<a.length; i++) {
			System.out.print(a[i] + " ");
		}
		System.out.println();
	}
	
	private static boolean less(Comparable v, Comparable w) {
		return v.compareTo(w) < 0;
	}
	
	private static  void swap(Comparable[] a, int i, int j) {
		Comparable t = a[i];
		a[i] = a[j];
		a[j] = t;
	}
	
	public static void main(String[] args) {
		Integer a[] = {23, 44, 56, 91, 2, 0, 81,100, 3, 17};  
		Integer b[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
		
		//无序数组排序
		sort(a);
		show(a);
		
		//有序数组排序
		sort(b);
		show(b);
	}
}

 

转载于:https://my.oschina.net/u/2548093/blog/833434

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值