冒泡排序及其优化

原创 2017年07月23日 22:11:09
/**
 * 冒泡排序及其优化
 * @author shuaicenglou
 *
 */
public class Maopao {
    public static void main(String[] args) {
        int[] a = {4,3,2,1};
        long startTime = System.nanoTime();    //获取开始时间
        sort(a);
        long endTime = System.nanoTime();      //获取结束时间
        System.out.println("程序运行时间:" + (endTime - startTime) + "ns");    //输出程序运行时间
        //for(int i:a) System.out.println(i);
    }

    /**
     * 优化算法2:优化外层循环的同时优化内层循环,内层循环每次循环记录最后一次交换发生的位置pos,
     * 当下一次循环开始时,[0,pos-1]是未排好序的,[pos,n-1]是有序的(n为数组长度),
     * 因为pos之后的数据没有发生交换,所以是有序的
     * 因此可以从0开始,到pos交换结束
     * 在最坏(完全逆序)情况下比较次数较优化算法1减少了50%,较原始算法比较次数减少75%
     * @param array
     */
    public static void sort2(int[] array){
        int n = array.length,pos=0,k=n;//pos记录最后发生交换的位置
        int num = 0;
        for(int i=0;i<n;i++){
            boolean flag = true;
            for(int j=0;j<k-1;j++){
                num+=1;
                if(array[j]>=array[j+1]){
                    int cache = array[j];
                    array[j] = array[j+1];
                    array[j+1] = cache;
                    flag = false;
                    pos = j;      //记录发生交换的位置
                }
            }
            k=pos+1;  //注意边界条件
            if(flag) break;
        }
        System.out.println("比较了"+num+"次");
    }
    /**
     * 优化算法1:使用标志位标记是否未发生交换,若未发生交换则提前结束循环
     * 比原始算法比较次数减少了25%
     * @param array
     */
    public static void sort(int[] array){
        int len = array.length;//记录数组长度
        int num=0;   //记录比较次数
        while(true){
            boolean flag = true;  //设置标志位
            for(int i=0;i<len-1;i++){
                num+=1;
                if(array[i]>=array[i+1]){
                    int mid = array[i];
                    array[i] = array[i+1];
                    array[i+1] = mid;
                    flag = false;
                }
            }
            if(flag) break;
        }
        System.out.println("比较了"+num+"次");
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

java中for循环的优化

作为java中三大循环之一的for循环,大家应该用的特别多,今天那就以我在项目中遇到的for循环优化来聊一聊for循环的优化. 首先是for循环的写法上面 最原始的写法 public void o...
  • dongnan591172113
  • dongnan591172113
  • 2016年06月30日 10:09
  • 4227

Hibernate优化策略

引言:  Hibernate是目前Java领域事实上的ORM实现标准,它以优雅的方式解决了面向对象和面向Table之间的不匹配状态,是解决Java应用中数据持久化的框架。由于Hibernate自行管理...
  • blueheart20
  • blueheart20
  • 2016年09月17日 21:49
  • 2347

App性能优化浅谈

前言前段时间给公司的小伙伴们进行了关于app性能优化的技术分享,这里我稍微整理一下也给大家分享一下,关于性能优化这个话题很大,涉及面可以很广,也可以很深入,本人能力有限,不会给大家讲特别难懂,特别底层...
  • wwj_748
  • wwj_748
  • 2015年12月16日 20:04
  • 10690

Android性能优化系列之布局优化

在Android开发中,UI布局可以说是每个App使用频率很高的,随着UI越来越多,布局的重复性、复杂度也会随之增长,这样使得UI布局的优化,显得至关重要,UI布局不慎,就会引起过度绘制,从而造成UI...
  • u012124438
  • u012124438
  • 2017年01月15日 22:20
  • 7227

Solr优化案例分析

随着umc接入主机的数量越来越多,每天产生的syslog日志数量也在剧增, 之前一天产生的syslog数量才不到1W,随着整个集团的 网络设备不端接入,导致现在每天产生的syslog数量大概在180w...
  • tiandesheng111
  • tiandesheng111
  • 2016年06月13日 20:10
  • 2154

让你提前认识软件开发(16):如何对程序进行优化?

第1部分 重新认识C语言 如何对程序进行优化?            对程序进行优化,是软件开发工程师必然会涉及到的问题。那么为什么要对程序进行优化呢?原因有以下几个:         第一,在原程序...
  • zhouzxi
  • zhouzxi
  • 2014年04月26日 19:48
  • 2710

MySQL in查询优化<一>

开发说他写了个SQL特别慢,让看看。 select * from t_channel where id_ in(select distinct cdbh from sjkk_gcjl where jg...
  • gua___gua
  • gua___gua
  • 2015年08月10日 17:57
  • 3981

一些代码优化的方法

谈到优化,很多人都会直接想到汇编。难道优化只能在汇编层次吗?当然不是,C++层次一样可以作代码优化,其中有些常常是意想不到的。在C++层次进行优化,比在汇编层次优化具有更好的移植性,应该是优化中的首选...
  • mydear_11000
  • mydear_11000
  • 2016年01月13日 14:30
  • 2020

最优化问题及其分类

优化技术是一种以数学为基础,用于求解各种工程问题优化解的应用技术。归纳而言,最优化问题分为函数优化问题和组合优化问题两大类,其中函数优化的对象是一定区间的连续变量,而组合优化的对象则是解空间中的离散状...
  • yangfeng1126
  • yangfeng1126
  • 2016年02月24日 22:24
  • 2034

带约束的最优化问题

学习支持向量机SVM时,拉格朗日对偶、Slater条件、KKT条件等一大堆概念席卷而来,让没系统学习过凸优化的笔者一头雾水,估计不少人都是这样吧。 为什么要引入一堆系数把约束条件与目标函数组合到一起?...
  • NewThinker_wei
  • NewThinker_wei
  • 2016年11月01日 01:12
  • 8530
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:冒泡排序及其优化
举报原因:
原因补充:

(最多只允许输入30个字)