比较

package text;

import java.util.ArrayList;
import java.util.List;

public class MaoPaoUtil {
    private int[] numbs={88,11,22,3,666,77,999,345,77,2121,413132,4545,5452,87874,1,545,-1,6554,213,1321};
    
    /**
     * 传统的冒泡算法
     */
    public void oldMaoPao(){

        int runNumb=0;
        /**
         * 先计算需要比对的次数,每次循环可以确定当轮的最大数或者最小数,10个数9次就出了结果,11个数10次就出了结果,类推
         */
        for(int i=0;i<numbs.length-1;i++){
        
            /**
             * 然后计算每一轮,里面有多少个数互相比较,每轮都少了一个数,10个数,9次就能比对为,公式就很简单了
             */
            for(int j=0;j<numbs.length-1-i;j++){
                runNumb++;
                /**
                 * 计算这一轮比对的值,为当前位置的值,和下一个位置的值
                 */
                int n1=numbs[j];
                int n2=numbs[j+1];
                /**
                 * 我们比哪个大
                 */
                if(n1>n2){
                    /**
                     * 把他们的位置值换一下,换位算法
                     */
                    int n3=n1;
                    n1=n2;
                    n2=n3;
                    /**
                     * 值互换好了,把值放进去
                     */
                    numbs[j]=n1;
                    numbs[j+1]=n2;
                }
                
            }
        
        }
        /**
         *         现在值就出来了    
         */
        for(int n:numbs){
            System.out.println(n);
        }
        System.out.println("总共计算了多少次:"+runNumb);
        System.out.println("-----------分割线------------");
    }
    
    /**
     * 传统的算法优化点点
     */
    public void oldMaoPaoIsBetter(){
        int runNumb=0;

        /**
         * 先计算需要比对的次数,每次循环可以确定当轮的最大数或者最小数,10个数9次就出了结果,11个数10次就出了结果,类推
         */
        for(int i=0;i<numbs.length;i++){
            boolean isChange=false;
            /**
             * 然后计算每一轮,里面有多少个数互相比较,每轮都少了一个数,10个数,9次就能比对为,公式就很简单了
             */
            for(int j=0;j<numbs.length-1-i;j++){
                runNumb++;
                /**
                 * 计算这一轮比对的值,为当前位置的值,和下一个位置的值
                 */
                int n1=numbs[j];
                int n2=numbs[j+1];
                /**
                 * 我们比哪个大
                 */
                if(n1>n2){
                    /**
                     * 把他们的位置值换一下,换位算法
                     */
                    int n3=n1;
                    n1=n2;
                    n2=n3;
                    /**
                     * 值互换好了,把值放进去
                     */
                    numbs[j]=n1;
                    numbs[j+1]=n2;
                    /**
                     * 记录这轮发生了改变
                     */
                    isChange=true;
                }
            }
            
            if(!isChange){
                /**
                 * 如果没发生改变,就说明,数据是最优的了,可以提前结束循环了
                 */
                break;
            }
        
        }
        /**
         *         现在值就出来了    
         */
        for(int n:numbs){
            System.out.println(n);
        }
        System.out.println("总共计算了多少次:"+runNumb);
        System.out.println("-----------分割线------------");
    }
    
    
    public void xiaoGeCreate(){
        int runNumb=0;
        /**
         * 先创建个对象,放存的值
         */
        List<Integer>numbList=new ArrayList<Integer>();
        int putIndex=-1;//放入的位置
        
        for(int i=0;i<numbs.length;i++){
            int nowN=numbs[i];
            if(putIndex==-1){
                runNumb++;
                /**
                 * 说明刚开始
                 */
                putIndex=0;
                numbList.add(nowN);
            }else{
                /**
                 * 如果上次放入进去的数,比这次的要大,把这个数字计算一下,放入到这个数的前面
                 */
                int ln=numbList.get(putIndex);
                
                if(ln==nowN){
                    runNumb++;
                    /**
                     * 相等,直接放到后面就好了
                     */
                    putIndex=putIndex++;
                    numbList.add(putIndex,nowN);
                }else if(nowN>ln){
                    /**
                     * 这个值比上轮大,计算在它后面的位置,从它后面一个位置开始计算
                     */
                    boolean isChange=false;
                    for(int j=putIndex+1;j<numbList.size();j++){
                        runNumb++;
                        int qn=numbList.get(j);
                        if(nowN<=qn){
                            /**
                             * 如果小于等于,就放到这个位置就好了
                             */
                            isChange=true;
                            System.out.println("----------pao dao zheli laile1:"+nowN+"-----------------"+ln);
                            numbList.add(j, nowN);
                            break;
                        }
                    }
                    /**
                     * 能运行到这里,说明这个数,比后面的都大,加到最后面就可以了
                     */
                    if(!isChange){
                        runNumb++;
                        putIndex=numbList.size();
                        numbList.add(nowN);
                        System.out.println("----------pao dao zheli laile2:"+nowN+"-----------------"+ln);
                    }
                
                
                }else{
                    /**
                     * 这个值比上轮小,计算在它前面的位置
                     */
                    boolean isChange=false;
                    for(int j=putIndex-1;j>=0;j--){
                        runNumb++;
                        int qn=numbList.get(j);
                        if(nowN>=qn){
                            /**
                             * 如果这次加入的数,比这个数字要大,就放到它的后面
                             */
                            isChange=true;
                            numbList.add(j+1, nowN);
                            System.out.println("----------pao dao zheli laile3:"+nowN+"-----------------"+ln);
                            break;
                        }
                        
                    }
                    if(!isChange){
                        runNumb++;
                        putIndex=0;
                        numbList.add(0,nowN);
                        System.out.println("----------pao dao zheli laile4:"+nowN+"-----------------"+ln);
                    }
                    
                
                }
                
                
                
            
                
                /**
                 *         现在值就出来了    
                 */
                for(int n:numbList){
                    System.out.println("shenme gui:"+n);
                }
                System.out.println("---------------------------------------------");
            }
        }

        /**
         *         现在值就出来了    
         */
        for(int n:numbList){
            System.out.println(n);
        }
        System.out.println(numbList.size()==numbs.length);
        System.out.println("总共计算了多少次:"+runNumb);
        System.out.println("-----------分割线------------");
    }
    
    
    public static void main(String[] args) {
        new MaoPaoUtil().oldMaoPao();
        new MaoPaoUtil().oldMaoPao();
        new MaoPaoUtil().xiaoGeCreate();;
    }
}
 

最后结果:老的冒泡是190次,新的冒泡,次数满足的条件下可能会比较少,自己改的算法只需要跑81次。缺点是新的算法,内存会多一倍,换位算法,多了几个占位对象,是为了写给某峰看的!很久没发布这种文章了,做开发还是要多动动脑子

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值