冒泡排序

来源:互联网 发布:win10系统重装软件 编辑:程序博客网 时间:2024/05/21 06:20

思想

它是经过一系列的交换动作。首先第一个元素和第二个元素比较,如果第一个大,则二者交换,否则不交换;然后第二个元素和第三个元素交换,若果第二个元素大,则交换,否则不交换……直到按照这种方式进行下去,最终最大的那个元素被交换到最后一个位置,一趟冒泡排序完成。下一趟排序同样上面的操作,但是只交换到倒数第二个位置,这个位置是第二大的元素。直到一趟排序中没有交换元素时候排序结束。这样每次把一个元素找到对应位置,大的上浮,小的下浮。

步骤

1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

例子

这里写图片描述
上面一个过程应该是一趟排序

动画

这里写图片描述

算法

package alg.sort;public class BubbleSort {    public void sort(int[] A){        int n = A.length;        boolean flag = true;;        for(int i=n-1;i>=0;i--){            flag = true;            for(int j=0;j<i;j++){                if(A[j]>A[j+1]){                    int tmp = A[j];                    A[j] = A[j+1];                    A[j+1] = tmp;                    flag = false;                }            }            if(flag)                return;        }    }    public static void main(String[] args){        int[] A = new int[]{49,38,65,97,76,13,27,49};        Print.printArray(A);        BubbleSort bubbleSort = new BubbleSort();        bubbleSort.sort(A);        Print.printArray(A);    }}

复杂度分析

(1)时间复杂度
最好情况:原始序列有序,不需要交换,时间复杂度O(n)
最坏情况:元素序列逆序,第i个元素回到排序位置应该交换i次,时间复杂度O(n2)
平均时间复杂度O(n2)
(2)空间复杂度
只用到常量的空间,空间复杂度O(1)

说明:
在一次排序后,可以使得最大元素回到排序后的位置

参考
1.《数据结构高分笔记》
2.链接

0 0
原创粉丝点击