冒泡排序 java实现

* 原理:比较两个相邻的元素,将值大的元素交换至右端。
*
* 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复第一趟步骤,直至全部排序完成。
*
* 第一趟比较完成后,最后一个数一定是数组中最大的一个数,所以第二趟比较的时候最后一个数不参与比较;
*
* 第二趟比较完成后,倒数第二个数也一定是数组中第二大的数,所以第三趟比较的时候最后两个数不参与比较;
*
* 依次类推,每一趟比较次数-1;
*
* ……
*
* 举例说明:要排序数组:int[] arr={6,3,8,2,9,1};
*
* 第一趟排序:
*
*     第一次排序:6和3比较,6大于3,交换位置:  3  6  8  2  9  1
*
*     第二次排序:6和8比较,6小于8,不交换位置:3  6  8  2  9  1
*
*     第三次排序:8和2比较,8大于2,交换位置:  3  6  2  8  9  1
*
*     第四次排序:8和9比较,8小于9,不交换位置:3  6  2  8  9  1
*
*     第五次排序:9和1比较:9大于1,交换位置:  3  6  2  8  1  9
*
*     第一趟总共进行了5次比较, 排序结果:      3  6  2  8  1  9
*
* ---------------------------------------------------------------------
*
* 第二趟排序:
*
*     第一次排序:3和6比较,3小于6,不交换位置:3  6  2  8  1  9
*
*     第二次排序:6和2比较,6大于2,交换位置:  3  2  6  8  1  9
*
*     第三次排序:6和8比较,6大于8,不交换位置:3  2  6  8  1  9
*
*     第四次排序:8和1比较,8大于1,交换位置:  3  2  6  1  8  9
*
*     第二趟总共进行了4次比较, 排序结果:      3  2  6  1  8  9
*
* ---------------------------------------------------------------------
*
* 第三趟排序:
*
*     第一次排序:3和2比较,3大于2,交换位置:  2  3  6  1  8  9
*
*     第二次排序:3和6比较,3小于6,不交换位置:2  3  6  1  8  9
*
*     第三次排序:6和1比较,6大于1,交换位置:  2  3  1  6  8  9
*
*     第二趟总共进行了3次比较, 排序结果:         2  3  1  6  8  9
*
* ---------------------------------------------------------------------
*
* 第四趟排序:
*
*     第一次排序:2和3比较,2小于3,不交换位置:2  3  1  6  8  9
*
*     第二次排序:3和1比较,3大于1,交换位置:  2  1  3  6  8  9
*
*     第二趟总共进行了2次比较, 排序结果:        2  1  3  6  8  9
*
* ---------------------------------------------------------------------
*
* 第五趟排序:
*
*     第一次排序:2和1比较,2大于1,交换位置:  1  2  3  6  8  9
*
*     第二趟总共进行了1次比较, 排序结果:  1  2  3  6  8  9
*
* ---------------------------------------------------------------------
*
* 最终结果:1  2  3  6  8  9
public class BubbleSort {
    public static void main(String[] args){
        Integer[] a = { 23, 21, 4, 6, 7, 5, 11, 1};
        bubbleSortMy(a);
        System.out.println(isSorted(a));
        show(a);
    }
    public static void bubbleSortMy(Comparable[] array){
        for(int i = 0; i < array.length - 1; i++){//外层循环控制趟数
            for(int j = 0; j < array.length - 1 - i; j++){//array.length - 1 - i 当i 加一时,说明 最后一位已经排好了最大值,所有最后一位无需再比较
//           内层循环控制每一趟的次数
                if(less(array[j + 1], array[j])){//后面的小于前面的数,就交换
                    exch(array, j, j + 1);
                }
            }
        }

    }

    /*
    对元素进行比较,v < w 返回真。

     */
    public static boolean less(Comparable v, Comparable w){
        return v.compareTo(w) < 0;//v小于w返回true
    }
    /*
    交换两个元素
     */
    public static void exch(Comparable[] a, int i, int j){
        Comparable t = a[i];
        a[i] = a[j];
        a[j] = t;
    }
    public static void show(Comparable[] a){
        for(int i = 0; i < a.length; i++) {
            System.out.print(a[i] + " ");
        }
    }
    public static boolean isSorted(Comparable[] a) {
        //测试元素是否有序
        for (int i = 1; i < a.length; i++) {
            if (less(a[i], a[i - 1])) {
                return false;
            }
        }
        return true;
    }

时间复杂度为O(n^2)

稳定的排序

猜你喜欢

转载自blog.csdn.net/qq_38765867/article/details/88936632