排序----冒泡排序(java实现)

2019-03-08  本文已影响0人  燕大虾呀

一、算法描述

冒泡排序:比如在一个长度为N的无序数组中,在第一趟从第一个数据开始遍历,遇到比他大的(小的),就交换位置,直到最大的(最小的)排到最后。第二趟找出倒二大的,N-1趟之后,数组有序。

二、算法分析

三种方法实现

1、暴力穷举-------- 没什么好说的

2、比如数组2 1 3 4 5 6 7 8 9,第一轮排序后变为1 2 3 4 5 6 7 8 9,后面所有排序都是白白浪费时间,所以,应该在数组已经有序了就停止排序,而判断的标志就是,某一趟排序没有交换。

3、比如数组6 5 2 3 1 4 7 8 9,第一轮排序后变为5 2 3 1 4 6 7 8 9,按照第前两种排序,第二轮排序将从第一个元素遍历到第n-1个元素,但其实从 ‘‘6‘’ 开始,数组后边已经有序,不需要载排序了,所以我们可以用一个变量记录下最后一个发生交换的位置,下一次遍历到这个数就可以了。

三、算法实现

package sort;

public class BubbleSort{
        
    public static void main(String[] args) {
        int[] arr = {8 , 4, 6, 2, 7, 3, 1, 9 ,5};
        int[] result1 = bubbleSort1(arr);
        show(result1);
        int[] result2 = bubbleSort1(arr);
        show(result2);
        int[] result3 = bubbleSort1(arr);
        show(result3);
    }
    
    
    /**
     *  冒泡排序 从小到大排序 无优化
     * @param arr
     * @return
     */
    public static int[] bubbleSort1(int[] arr) {
        int n = arr.length;//长度
        int temp = 0;//中间变量
        
        for(int i = 0 ; i < n-1 ; i++) {
            for(int j = 0 ; j < n-i-1 ; j++) {
                //如果上边的泡泡更重(值更大),则往下沉(交换)
                if(arr[j]>arr[j+1]) {
                    temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
        return arr;
    }
    
    /**
     *  冒泡排序 从小到大排序 优化一
     * @param arr
     * @return
     */
    public static int[] bubbleSort2(int[] arr) {
        int n = arr.length;//长度
        int temp = 0;//中间变量
        int count = 0;//计数器
        
        for(int i = 0 ; i < n-1 ; i++) {
            count = 0;//恢复为0
            for(int j = 0 ; j < n-i-1 ; j++) {
                //如果上边的泡泡更重(值更大),则往下沉(交换)
                if(arr[j]>arr[j+1]) {
                    temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                    count++;//交换次数+1
                }
            }
            if(count == 0) {//此轮排序无交换,数组已经有序
                break;//退出循环
            }
            
        }
        return arr;
    }
    
    /**
     *  冒泡排序 从小到大排序 优化二
     * @param arr
     * @return
     */
    public static int[] bubbleSort3(int[] arr) {
        int n = arr.length;//长度
        int temp = 0;//中间变量
        int count = 0;//计数器
        int k = n-1;//记录最后一次交换的位置,其后已经有序,初始值为n-1
        int flag = 0;
        
        for(int i = 0 ; i < n-1 ; i++) {
            count = 0;//恢复为0
            k = flag;
            for(int j = 0 ; j < k ; j++) {
                //如果上边的泡泡更重(值更大),则往下沉(交换)
                if(arr[j]>arr[j+1]) {
                    temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                    count++;//交换次数+1
                    flag = j+1;
                }
            }
            if(count == 0) {//此轮排序无交换,数组已经有序
                break;//退出循环
            }
            
        }
        return arr;
    }
    
    
    public static void show(int[] result) {
        for(int i = 0 ; i < result.length ; i++) {
            System.out.print(result[i]+" ");
        }
        System.out.println();
    }
}

所有内容均个人编辑,如有错误,欢迎指正!

上一篇下一篇

猜你喜欢

热点阅读