码迷,mamicode.com
首页 > 编程语言 > 详细

冒泡排序

时间:2021-01-27 13:07:53      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:string   package   bool   标识   下标   break   介绍   static   format   

冒泡排序

基本介绍

冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐
向上冒。

算法优化

因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换。从而减少不必要的比较。

算法过程

原始数组:3, 9, -1, 10, 20

第一趟排序
(1)  3, 9, -1, 10, 20   // 如果相邻的元素逆序就交换
(2)  3, -1, 9, 10, 20
(3)  3, -1, 9, 10, 20
(4)  3, -1, 9, 10, 20

第二趟排序
(1) -1, 3, 9, 10, 20 //交换
(2) -1, 3, 9, 10, 20
(3) -1, 3, 9, 10, 20

第三趟排序
(1) -1, 3, 9, 10, 20
(2) -1, 3, 9, 10, 20

第四趟排序
(1) -1, 3, 9, 10, 20


小结冒泡排序规则
(1) 一共进行 数组的大小-1 次 大的循环
(2)每一趟排序的次数在逐渐的减少
(3) 如果我们发现在某趟排序中,没有发生一次交换, 可以提前结束冒泡排序。这个就是优化

  

推导过程

import java.util.Arrays;
public class bubbleSort01 {
    public static void main(String[] args) {
        int []arr={9,-1,20,3,2};
        System.out.println("排序前:");
        System.out.println(Arrays.toString(arr));
        int temp=0;
        //冒泡排序-升序
        for (int i = 0; i < arr.length - 1-0; i++) {
            if(arr[i]>arr[i+1]){
                temp=arr[i];
                arr[i]=arr[i+1];
                arr[i+1]=temp;
            }
        }
        System.out.println("第一趟排序后:");
        System.out.println(Arrays.toString(arr));
        //冒泡排序-升序
        for (int i = 0; i < arr.length-1-1; i++) {
            if(arr[i]>arr[i+1]){
                temp=arr[i];
                arr[i]=arr[i+1];
                arr[i+1]=temp;
            }
        }
        System.out.println("第二趟排序后:");
        System.out.println(Arrays.toString(arr));
        //冒泡排序-升序
        for (int i = 0; i < arr.length-1-2; i++) {
            if(arr[i]>arr[i+1]){
                temp=arr[i];
                arr[i]=arr[i+1];
                arr[i+1]=temp;
            }
        }
        System.out.println("第三趟排序后:");
        System.out.println(Arrays.toString(arr));
        //冒泡排序-升序
        for (int i = 0; i < arr.length-1-3; i++) {
            if(arr[i]>arr[i+1]){
                temp=arr[i];
                arr[i]=arr[i+1];
                arr[i+1]=temp;
            }
        }
        System.out.println("第四趟排序后:");
        System.out.println(Arrays.toString(arr));
    }
}

推导结论

 public static void main(String[] args) {
        int[] arr = {9, -1, 20, 3, 2};
        System.out.println("排序前:");
        System.out.println(Arrays.toString(arr));
        int temp = 0;
        for (int i = 0; i <arr.length-1 ; i++) {
            for (int j = 0; j < arr.length-1-i; j++) {
                if(arr[j]>arr[j+1]){
                    temp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }
            }
            System.out.println("第"+(i+1)+"排序后:");
            System.out.println(Arrays.toString(arr));
        }

    }

代码优化

public static void main(String[] args) {
        int[] arr = {9, -1, 20, 3, 2};
        System.out.println("排序前:");
        System.out.println(Arrays.toString(arr));
        int temp = 0;
        boolean flag = false;//比较标识符
        for (int i = 0; i <arr.length-1 ; i++) {
            for (int j = 0; j < arr.length-1-i; j++) {
                if(arr[j]>arr[j+1]){
                    flag=true;
                    temp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }
            }
            System.out.println("第"+(i+1)+"排序后:");
            System.out.println(Arrays.toString(arr));
            if(!flag){
                break;
            }else{
                flag=false;
            }
        }

    }

封装算法

package com.javaee.sort;

import java.util.Arrays;

public class bubbleSort01 {

    public static void main(String[] args) {
        int[] arr = {9, -1, 20, 3, 2};
        System.out.println("排序前:");
        System.out.println(Arrays.toString(arr));
        System.out.println("排序后:");
        bubbleSort(arr);
        System.out.println(Arrays.toString(arr));
    }
    public static void bubbleSort(int []arr){
        int temp = 0;
        boolean flag = false;//比较标识符
        for (int i = 0; i <arr.length-1 ; i++) {
            for (int j = 0; j < arr.length-1-i; j++) {
                if(arr[j]>arr[j+1]){
                    flag=true;
                    temp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }
            }
            if(!flag){
                break;
            }else{
                flag=false;
            }
        }
    }
}

时间测试

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

public class bubbleSort01 {

    public static void main(String[] args) {
        final int length =20000;
//        int[] arr = {9, -1, 20, 3, 2};
        int []arr=new int[length];
        for (int i = 0; i < length; i++) {
            arr[i]=(int)(Math.random()*length);
        }
        Date date1 = new Date();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String s1 = format.format(date1);
        System.out.println("排序前时间:");
        //System.out.println(Arrays.toString(arr));
        System.out.println(s1);
        bubbleSort(arr);
        Date date2 = new Date();
        String s2 = format.format(date2);
        System.out.println("排序后时间:");
        //System.out.println(Arrays.toString(arr));
        System.out.println(s2);
    }
    public static void bubbleSort(int []arr){
        int temp = 0;
        boolean flag = false;//比较标识符
        for (int i = 0; i <arr.length-1 ; i++) {
            for (int j = 0; j < arr.length-1-i; j++) {
                if(arr[j]>arr[j+1]){
                    flag=true;
                    temp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }
            }
            if(!flag){
                break;
            }else{
                flag=false;
            }
        }
    }
}

比较次数与交换次数

  public static void bubbleSort(int []arr){
        int compare = 0;//比较次数
        int change=0;//比较次数
        int temp = 0;
        boolean flag = false;//比较标识符
        for (int i = 0; i <arr.length-1 ; i++) {
            for (int j = 0; j < arr.length-1-i; j++) {
                compare++;
                if(arr[j]>arr[j+1]){
                    flag=true;
                    change++;
                    temp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }
            }
            if(!flag){
                break;
            }else{
                flag=false;
            }
        }
        System.out.println("冒泡排序比较次数:"+compare);
        System.out.println("冒泡排序交换次数:"+change);
    }

冒泡排序

标签:string   package   bool   标识   下标   break   介绍   static   format   

原文地址:https://www.cnblogs.com/wanwanyuan/p/14327693.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!