天天看点

冒泡排序、选择排序、插入排序总结

排序(sort):就是将无序的数据按照特定的规则排成有序数据(升序、降序)。  

这篇文章我们来了解一下Java中常见的三种排序方式,即冒泡排序、二分查找、插入排序。

既然要排序,那么就要考虑时间复杂度和空间复杂度这两个因素,我们可以在System.currentTimeMillis()里面查看。

一、冒泡排序

1.冒泡排序思路

        冒泡排序就像烧开的水一样,里面大的泡泡往上浮。那么要进行冒泡排序就要从前往后遍历整个数组的元素,即从第一个元素开始遍历,将第一个元素和下一个元素进行比较,如果第一个元素大于下一个元素,则和下一个元素交换位置,继续和下一个元素进行比较,直至小于下一个元素,从而进行循环。总的来说,就是将一个乱序的数组排成一个升序的数组。

2.冒泡排序的图解(大数上浮法)

冒泡排序、选择排序、插入排序总结

 3.冒泡排序的具体分析

a = [2,98,-20,57,5,-7,88]    

原顺序:2 , 98 , -20 , 57 , 5 , -7 , 88

第一次:2 , -20 , 57 , 5 , -7 , 88 , 98      

第二次:-20 , 2 , 5 , -7 , 57 , 88 , 98     

第三次:-20 , 2 , -7 , 5 , 57 , 88 , 98      

第四次:-20 , -7 , 2 , 5 , 57 , 88 , 98     

4.冒泡排序的代码示例

package com.simple.ex.day09;

public class Sort01 {
    public static void main(String[] args) {
        int[] a = {2,98,-20,57,5,-7,88};

        System.out.println("排序前:");
        for (int i : a) {
            System.out.print(i + ", ");
        }

        bubbleSort(a);
        
        System.out.println("\n排序后:") ;
        for (int i : a) {
            System.out.print(i + ",");
        }
    }
    public static void bubbleSort(int[] arr) {
        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]) {
                    swap(arr, j, j + 1);
                }
            }
        }
    }
    private static void swap(int[] arr, int i, int j) {
        arr[j] = arr[j] ^ arr[i];
        arr[i] = arr[j] ^ arr[i];
        arr[j] = arr[j] ^ arr[i];
    }
}



程序运行结果如下:
/***
 * 排序前:
 * 2, 98, -20, 57, 5, -7, 88, 
 * 排序后:
 * -20, -7, 2, 5, 57, 88, 98, 
 */
           

二、选择排序

1.选择排序的思路

        选择排序即在一个乱序数组中,假设第一个元素是最小值,将第一个元素和之后的元素进行比较,直至找到真正的最小值,交换这两个元素的位置即可。

2.选择排序的图解

冒泡排序、选择排序、插入排序总结

 3.选择排序的具体分析

a = [2,98,-20,57,5,-7,88]    

原顺序:2 , 98 , -20 , 57 , 5 , -7 , 88

第一次:-20 , 98 , 2 , 57 , 5 , -7 , 88

第二次:-20 , -7 , 2 ,  57 , 5 , 98 , 88

第三次:-20 , -7 , 2 ,  57 , 5 , 98 , 88     //和第二次一样,排序了,但未找到真正的最小值

第四次:-20 , -7 , 2 ,  5 , 57 , 98 , 88

第五次:-20 , -7 , 2 ,  5 , 57 , 98 , 88        //和第四次一样,排序了,但未找到真正的最小值

第六次:-20 , -7 , 2 , 5 ,  57 , 88 , 98

4.选择排序的代码示例

package com.simple.ex.day09;

public class Sort02 {
    public static void main(String[] args) {
        int[] a = {2, 98, -20, 57, 5, -7, 88};

        System.out.println("排序前:");
        for (int i : a) {
            System.out.print(i + ", ");
        }
        selectSort(a);
        System.out.println("\n排序后:");
        for (int i : a) {
            System.out.print(i + ", ");
        }
    }

    public static void selectSort(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            int min = i;
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[j] < arr[min]) {
                    // j对应的下标才是最小值
                    min = j;
                }
            }
            // 假设失败,真正的最小值是min
            if (min != i) {
                swap(arr, min, i);
            }
        }
    }

    private static void swap(int[] arr, int i, int j) {
        arr[j] = arr[j] ^ arr[i];
        arr[i] = arr[j] ^ arr[i];
        arr[j] = arr[j] ^ arr[i];
    }

}



程序运行结果如下:
/***
 * 排序前:
 * 2, 98, -20, 57, 5, -7, 88, 
 * 排序后:
 * -20, -7, 2, 5, 57, 88, 98, 
 */

           

三、插入排序

1.插入排序的思路

        插入排序即把第一个元素看作有序数组,从第二个元素开始依次插入到这个有序数组中,插入时这个数组必须保持有序。

2.插入排序的图解

冒泡排序、选择排序、插入排序总结

 3.插入排序的具体分析

a = [2,98,-20,57,5,-7,88]    

原顺序:2 , 98 , -20 , 57 , 5 , -7 , 88

第一次:2 , 98 ,      -20 , 57 , 5 , -7 , 88

第二次:-20 , 2 , 98 ,     57 , 5 , -7  , 88

第三次:-20 , 2 , 57 , 98 ,     5 , -7 , 88

第四次:-20 , 2 , 5 , 57 , 98 ,     -7 , 88

第五次:-20 , -7 , 2 , 5 , 57 , 98 ,     88

第六次:-20 , -7 , 2 , 5 , 57 , 88 , 98

4.插入排序的代码示例

package com.simple.ex.day09;

public class Sort03 {
    public static void main(String[] args) {
        int[] a = {2,98,-20,57,5,-7,88};

        System.out.println("排序前:");
        for (int i : a) {
            System.out.print(i + ", ");
        }

        insertSort(a);

        System.out.println("\n排序后:") ;
        for (int i : a) {
            System.out.print(i + ",");
        }
    }
    public static void insertSort(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            // 取下一个元素,倒着插入,保证插入时数组一直有序
            for (int j = i + 1; j > 0; j--) {
                if (arr[j] < arr[j - 1]) {
                    swap(arr, j, j - 1);
                }
            }
        }
    }
    private static void swap(int[] arr, int i, int j) {
        arr[j] = arr[j] ^ arr[i];
        arr[i] = arr[j] ^ arr[i];
        arr[j] = arr[j] ^ arr[i];
    }
}


程序运行结果如下:
/***
 * 排序前:
 * 2, 98, -20, 57, 5, -7, 88,
 * 排序后:
 * -20, -7, 2, 5, 57, 88, 98,
 */