排序算法之冒泡排序

冒泡排序

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

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

代码实现

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

import java.util.*;
//改进的冒泡排序算法
public class BubbleSort {
    public int[] bubbleSort(int[] A, int n) {

        for(int i=0;i1;i++){
            //定义一个标志变量
            boolean flag = false;     
            for(int j=0;j1;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).

你可能感兴趣的:(算法与数据结构)