Java排序之冒泡排序

冒泡排序(Bubble_sort)

原理:
    临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似。
    它适合数据规模很小的时候,而且它的效率也比较低,但是作为入门的排序算法,还是值得学习的
代码
// 程序目的:传统冒泡排序法
public class BobbleSort extends Object
{
    public static void main(String args[])
    {
        int i,j,tmp;
        int data[]={6,5,9,7,2,8};   //原始数据

        System.out.println("冒泡排序法:");
        System.out.print("原始数据为:");
        for(i=0;i<6;i++)
        {
            System.out.print(data[i]+" ");
        }
        System.out.print("\n");

        for (i=5;i>0;i--)       //扫描次数
        {
            for (j=0;j<i;j++)       //比较、交换次数
            {
                // 比较相邻两数,如第一数较大则交换
                if (data[j]>data[j+1])
                {
                    tmp=data[j];
                    data[j]=data[j+1];
                    data[j+1]=tmp;
               }
            }

            //把各次扫描后的结果打印
            System.out.print("第"+(6-i)+"次排序后的结果是:"); 
            for (j=0;j<6;j++)
            {
                System.out.print(data[j]+" ");
            }           
            System.out.print("\n");
        }

        System.out.print("排序后结果为:");
        for (i=0;i<6;i++)
        {
            System.out.print(data[i]+" ");
        }
        System.out.print("\n");
    }
}
算法复杂度:
    最坏情况的时间复杂度是O(n²)。
优化冒泡排序:
    从上面我们可以知道冒泡排序的核心是两两对比进行交换。如果有一个无序数列(2,1,3,4,5,6,7,8,9,10)。从第一次循环交换后的操作,可以说都是没必要的。所以,这些操作就是我们需要优化的地方。所以,我们可以通过设置一个标记变量,标记数列中的数是否在循环结束前就已经排好序
public class  extends Object
    {
    int data[]=new int[]{4,6,2,7,8,9};  //原始数据

    public static void main(String args[])
    {       
        System.out.print("改良冒泡排序法\n原始数据为:");
        CH08_02 test=new CH08_02();
        test.showdata();
        test.bubble();
    }

    public void showdata ()     //利用循环打印数据
    {
        int i;
        for (i=0;i<6;i++)
        {
            System.out.print(data[i]+" ");
        }
        System.out.print("\n");
    }

    public void bubble ()
    {
        int i,j,tmp,flag;       
        for(i=5;i>=0;i--)
        {
            flag=0;           //flag用来判断是否有执行交换的动作
            for (j=0;j<i;j++)
            {
                if (data[j+1]<data[j])
                {
                    tmp=data[j];
                    data[j]=data[j+1];
                    data[j+1]=tmp;
                    flag++;    //如果有执行过交换,则flag不为0
                }
            }
            if (flag==0)
            {
                break;
            }

            //当执行完一次扫描就判断是否做过交换动作,如果没有交换过数据,
            //表示此时数组已完成排序,故可直接跳出循环

            System.out.print("第"+(6-i)+"次排序:");
            for (j=0;j<6;j++)
            {
                System.out.print(data[j]+" ");
            }
            System.out.print("\n");
        }

    System.out.print("排序后结果为:");
    showdata ();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值