冒泡排序算法

冒泡排序

冒泡排序(Bubble Sort)是一种交换排序,基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。

在最好的情况下,也就是数列本身是排好序的,需要进行 n - 1 次比较;在最坏的情况下,也就是数列本身是逆序的,需要进行 n(n-1)/2 次比较。因此冒泡排序总的时间复杂度是 O(n^2)。

public class SortTest {

    public static void main(String[] args) {
        int[] arr = {14, 12, 4, 6, 1, 16, 11, 8, 3, 9};
        bubbleSort(arr);
        for (int x : arr){
            System.out.print(x+", ");
        }
    }
    /*
        冒泡排序(从小到大)
     */
    private static void bubbleSort(int[] arr){
        for (int i = 0; i < arr.length; i++){
            for (int j = 1; j < arr.length-i; j++){
                if(arr[j-1] > arr[j]){
                    /* 前面的数字大于后面的数字就交换 */
                    int temp;
                    temp = arr[j-1];
                    arr[j-1] = arr[j];
                    arr[j] = temp;
                }
            }
        }
    }

}

运行结果为:

1, 3, 4, 6, 8, 9, 11, 12, 14, 16,
如果对于一个本身有序的序列,或则序列后面一大部分都是有序的序列,上面的算法就会浪费很多的时间开销,这里设置一个标志flag,如果这一趟发生了交换,则为true,否则为false。明显如果有一趟没有发生交换,说明排序已经完成。
 /*
        优化后的冒泡排序(从小到大)
     */
    private static void bubbleSort(int[] arr){
        /* 定义一个标志位 */
       boolean falg = true;
        while (falg) {
            falg = false;
            for (int i = 0; i < arr.length; i++){
                for (int j = 1; j < arr.length-i; j++){
                    if(arr[j-1] > arr[j]){
                        /* 交换数据 */
                        int temp;
                        temp = arr[j-1];
                        arr[j-1] = arr[j];
                        arr[j] = temp;
                        /* 如果一次都没有交换数据,代表序列已经有序,即利用标志为false退出排序 */
                        falg = true;
                    }
                }
            }
        }
    }


阅读更多
版权声明:博客源码、框架技术教程和更多干货信息请关注公众号【IT理想国】(左侧二维码)。内含有海量程序猿所需要的干货资源!欢迎各位大佬们关注,共同学习。另转载请注明下出处! https://blog.csdn.net/qq_33404395/article/details/80323359
个人分类: 日常算法
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭