排序算法总结之冒泡排序

冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法。它的基本思想就是两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。



例如:初始序列3,6,4,2,11,10,5;从头开始,两两相比,若a[i]>a[i+1],则将两者交换;

从上面的排序过程来看,其实在第2趟结束后,数据序列就已经是有序的了,因此可以提前结束循环,从而避免3~6趟的不必要的比较。



Java实现:

package com.liuhao.sort;

import java.util.Arrays;

public class BubbleSort {

	public static void bubbleSort(DataWrap[] data) {
		System.out.println("开始排序");
		int arrayLength = data.length;

		for (int i = 0; i < arrayLength - 1; i++) {
			boolean flag = false; //记录某趟是否发生元素交换
			for (int j = 0; j < arrayLength - 1 - i; j++) {
				// 处的元素值大于j+1处的,j处data要往后沉
				if(data[j].compareTo(data[j+1]) > 0){
					DataWrap tmp = data[j];
					data[j] = data[j+1];
					data[j+1] = tmp;
					flag = true;
				}
			}

			System.out.println(Arrays.toString(data));

			//如果某趟没有发生交换,说明序列已经有序,就不需要进行之后的比较了
			if(!flag){
				break;
			}
		}
	}

	public static void main(String[] args) {
		DataWrap[] data = {
				new DataWrap(21, "")
				,new DataWrap(30, "")
				,new DataWrap(49, "")
				,new DataWrap(30, "*")
				,new DataWrap(16, "")
				,new DataWrap(9, "")
		};

		System.out.println("排序之前:" + Arrays.toString(data));

		bubbleSort(data);

		System.out.println("排序之后:" + Arrays.toString(data));
	}
}

排序效果:



冒泡排序的时间效率是不确定的:最好的情况下,初始序列已经处在有序状态,执行一趟冒泡即可,做n-1次比较,无需进行任何交换;但在最坏的情况下,初始序列完全逆序,算法要执行n-1趟冒泡,第i趟做n-i次比较,执行n-i-1次对象交换,此时比较总次数为n*(n-1)/2,数据移动总次数为n*(n-1)*3/2。

冒泡排序算法的空间效率很高,只需一个附加程序单元用于交换,其空间效率为O(1)。

同时冒泡排序是稳定的

排序算法总结之冒泡排序

时间: 2024-07-31 17:30:37

排序算法总结之冒泡排序的相关文章

排序算法之从冒泡排序所想到的

1.算法思想描述: 1)将相邻的两个数进行比较,如果前面的一个大于后面的一个,则将他们交换.每次循环能使一个数达到有序状态. 2.时间复杂度: 平均O(n^2).最佳:O(n),在序列一开始就是正序的时候取得 3.实现及优化. 以下给出三种实现方式 /* * bubblesort.cpp * * Created on: 2014年5月17日 * Author: pc */ #include <iostream> #include <cstdio> #include <ctim

排序算法系列:冒泡排序与双向冒泡排序

概述 排序算法应该算是一个比较热门的话题,在各个技术博客平台上也都有一些博文进行了一定程度的讲解.但还是希望能从自我完善的角度出发,可以更详细.全面.形象地表达这些算法的精髓.本文就先从最简单的冒泡排序开始说起,别说你已经彻底了解了冒泡排序算法(虽然一开始我也是这样以为的). 版权说明 本文链接:http://blog.csdn.net/lemon_tree12138/article/details/50474230 – Coding-Naga - 转载请注明出处 目录 概述 版权说明 目录 冒

排序算法大荟萃——冒泡排序算法

1.基本思想:将无序数组R[1...n]垂直排列,从下往上扫描数组R,对比相邻的两个元素,如果上面的元素值小于下面的值,则调整这两个相邻元素的位置,然后继续向上扫描,直到排好序为止. 2.排序过程: (1)初始化:读取无序数组R[1...n] (2)第一趟扫描:从数组R底部开始向上扫描,依次比较相邻的两个元素,若发现数值较小的在上面,则交换两个元素的位置.即依次比较(R[n].R[n-1]).(R[n-1].R[n-2]).....(R[2].R[1]),对于每对元素(R[j].R[j+1]),

排序算法入门之冒泡排序及其优化(java实现)

冒泡排序思想(从小到大): 比较相邻两个元素,如果第一个元素比第二个元素大,就交换他们的位置.第一趟,从第一个元素开始,第一个元素和第二个元素比较,如果第一个元素比第二个元素大,则交换位置:接下来比较第二.第三个元素,大的放后面,以此类推,直到最后两个.第一趟比较结束后,最大的元素放到了最后一个位置.接下来进行第二趟排序,从第一个元素到倒数第二个元素(因为最后一个已经是最大的了)执行上面步骤.依次执行下去. 此时的最优最差平均时间复杂度为O(n^2). 优化:加一个标志位,当交换元素时为true

Java排序算法(一):冒泡排序

[基本思想] 冒泡排序是一种交换排序,它的基本思想是两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止. [Java实现] public class BubbleSort { public static void main(String[] args) { int[] arr = { 49, 38, 65, 97, 76, 13, 27, 49, 78, 34, 12, 64, 1, 8 }; System.out.println("排序之前:"); for (int i

八大排序算法之五--交换排序—冒泡排序(Bubble Sort)

基本思想: 在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒.即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换. 算法实现:(HDU 1040 亲测 AC) #include<iostream> using namespace std; const int N =1005; void BubbleSort(int a[],int ); void print(int a[],int num); vo

【PHP面试题】通俗易懂的两个面试必问的排序算法讲解:冒泡排序和快速排序

又到了金三银四找工作的时间,相信很多开发者都在找工作或者准备着找工作了.一般应对面试,我们无可厚非的去刷下面试题.对于PHPer来说,除了要熟悉自己所做的项目,还有懂的基本的算法.下面来分享下PHP面试中常会问到的算法:冒泡排序和快速排序 冒泡排序:一一对比排序 基本思想: 重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小)错误就把他们交换过来.走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素已经排序完成. 图解: 1.第一次:拿着数组的第一个元素

[Java]排序算法&gt;交换排序&gt;【冒泡排序】(O(N*N)/稳定/N较小/有序/顺序+链式)

1 冒泡排序 1.1 算法思想 交换排序的基本思想:两两比较待排序记录的关键字,一旦发现2个记录不满足次序要求时,则:进行交换,直到整个序列全部满足要求为止. 1.2 算法特征 属于[交换排序] 冒泡排序 快速排序 适用于[稳定性]:稳定 适用于[规模N]:较小 适用于[有序性]:有序 适用于[存储结构]:顺序存储 or 链式存储(二者均可) 相关口诀:[插冒归堆]好有序,[插冒]记录个数小,[插冒二选]时N方 1.3 算法实现 import java.util.Arrays; public c

JS中的排序算法(-)冒泡排序

冒泡排序算法 例子:10,8,9,6,4,20,5 第一轮  1)10>8  交换数据 得到:8,10,9,6,4,20,5 2)10>9  交换数据 得到:8,9,10,6,4,20,5 3)10>6  交换数据 得到:8,9,6,10,4,20,5 4)10>4  交换数据 得到:8,9,6,4,10,20,5 5)10<20  不交换数据 得到:8,9,6,4,10,20,5 6)20>5  交换数据 得到:8,9,10,6,4,5,20 结果:8,9,10,6,