博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
排序之冒泡排序
阅读量:3705 次
发布时间:2019-05-21

本文共 2381 字,大约阅读时间需要 7 分钟。

冒泡排序思想

在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。


代码实现

package sort;public class BubbleSort {    public static void bubbleSort(int[] data) {        if (data == null || data.length <=1) {            return;        }//i表示的是排序趟数,也表示了每次排序的边界        for (int i = data.length - 1; i >= 1; i--) {            for (int j = 1; j <= i; j++) {                if (data[j - 1] > data[j]) {                    swap(data, j - 1, j);                }            }        }        return;    }    private static void swap(int[] data, int p, int q) {        if (data == null || data.length <= 0 || p < 0 || q < 0 || data.length <= p || data.length <= q) {            throw new IllegalArgumentException("Invalid parameters in swap method!");        }        int tmp = data[p];        data[p] = data[q];        data[q] = tmp;    }}

性能分析:稳定

时间复杂度:O(n^2)


冒泡排序算法的改进

改进一:设置标志性变量exchange

对冒泡排序常见的改进方法是加入一标志性变量exchange,用于标志某一趟排序过程中是否有数据交换,如果进行某一趟排序时并没有进行数据交换,则说明数据已经按要求排列好,可立即结束排序,避免不必要的比较过程。

public static void bubbleSort2(int[] data) {        if (data == null || data.length <=1) {            return;        }        boolean exchange = true;        for (int i = data.length - 1; i >= 1 && exchange; i--) {            exchange = false;            for (int j = 1; j <= i; j++) {                if (data[j - 1] > data[j]) {                    swap(data, j - 1, j);                    exchange = true;                }            }        }        return;    }

最好情况的时间复杂度是:O(n)

改进二:正向和反向两遍冒泡

传统冒泡排序中每一趟排序操作只能找到一个最大值或最小值,我们考虑利用在每趟排序中进行正向和反向两遍冒泡的方法一次可以得到两个最终值(最大者和最小者) , 从而使排序趟数几乎减少了一半。

public static void bubbleSort3(int[] data) {        if (data == null || data.length <=1) {            return;        }        int low = 0;        int high = data.length - 1;        int tmp, j;        while (low < high) {            for (j = low; j < high; ++j) //正向冒泡,找到最大者                if (data[j] > data[j+1]) {                    tmp = data[j]; data[j] = data[j + 1]; data[j + 1] = tmp;                }            --high;                 //修改high值, 前移一位            for (j = high; j > low; --j) //反向冒泡,找到最小者                if (data[j] < data[j-1]) {                    tmp = data[j]; data[j] = data[j - 1]; data[j - 1] = tmp;                }            ++low;                  //修改low值,后移一位        }        return;    }

排序趟数几乎减少了一半,但是每趟元素比较的次数增多。

时间复杂度仍然是:O(n^2)

转载地址:http://gkicn.baihongyu.com/

你可能感兴趣的文章
How Does EDI Work?
查看>>
Paper-based vs EDI Transaction Process --
查看>>
100 人内芯片设计初创公司 IT 方案(上)
查看>>
100 人内芯片设计初创公司 IT 方案(中)
查看>>
100 人内芯片设计初创公司 IT 方案(下)
查看>>
IBM Spectrum LSF
查看>>
IBM Spectrum LSF Suites
查看>>
IBM Spectrum LSF Application Center
查看>>
IBM Spectrum LSF Process Manager
查看>>
IBM Spectrum LSF Data Manager
查看>>
IBM Spectrum LSF Explorer
查看>>
IBM Spectrum LSF License Scheduler
查看>>
IBM Spectrum LSF RTM
查看>>
IBM Spectrum LSF-手册
查看>>
评估HPC工作负载管理解决方案时的主要注意事项(一)
查看>>
评估HPC工作负载管理解决方案时的主要注意事项(二)
查看>>
评估HPC工作负载管理解决方案时的主要注意事项(三)
查看>>
OpenText内容套件
查看>>
如何在2021年选择最佳的内容服务平台
查看>>
OpenText Content Suite平台
查看>>