排序算法之冒泡排序

来源:互联网 发布:unity3d lua教程 编辑:程序博客网 时间:2024/06/07 01:23

冒泡排序

冒泡排序算法是蛮力算法设计思想的一个典型应用,相应的还有选择排序,后后续会谈到。冒泡排序算法的核心思想就是比较表中的相邻元素,如果它们是逆序的话就交换它们的位置,重复多次以后,最终,最大的元素就“沉到”了列表中的最后一个位置。第二遍操作将第二大的元素沉下去,依次执行n-次,从而得到有序的列表。第i遍冒泡排序可以用下面的示例图表示:
这里写图片描述

竖线后面的表示已经排好序的部分最大元素,前面表示排序的过程。

代码实现

改进的冒泡排序算法的java实现代码如下:

import java.util.*;//改进的冒泡排序算法public class BubbleSort {    public int[] bubbleSort(int[] A, int n) {        for(int i=0;i<n-1;i++){            //定义一个标志变量            boolean flag = false;                 for(int j=0;j<n-i-1;j++){                if(A[j]>A[j+1]){                    int temp = A[j];                    A[j] = A[j+1];                    A[j+1] =  temp;                    flag = true;                }                         }            //如果标志变量没有发生变化,说明内部已经全部有序,直接跳出循环即可            if(!flag){                break;            }              }        return A;    }}

改进冒泡排序算法的思路是冒泡排序在不断进行相邻比较,交换迭代的过程中,如果在第i次迭代中相邻元素没有发生一次交换,说明列表内部已经完成排序,无需进行后面的迭代,从而提升了排序效率。这里可以在代码中设置一个标志变量用于标记第i次迭代是否发生元素交换,根据标志变量的值做出相应的处理即可。

算法时间复杂度分析

冒泡排序算法的基本操作是相邻元素的比较,即A[j]与A[j+1]元素的比较。假设算法的输入为规模大小为n的数组,则最好情况下即输入的数组为一个升序有序数组,那么算法在执行完第一次外层循环时就会结束,基本操作次数为n-1次,故算法的复杂度为O(n);最坏情况下即输入的数组为一个降序数组,那么算法的基本操作次数大约为内外层循环次数之积,故时间复杂度为O(n^2);冒泡排序算法的平均时间复杂度也为O(n^2).

原创粉丝点击