冒泡、插入、选择排序算法

2018-11-03  本文已影响0人  匿名用户_bcc3

冒泡、插入、选择排序是最基础的三种算法,这三种算法的最差复杂度都是O(n^2),相对来说还是比较低效的。后面还会介绍O(nlogn)复杂度的算法。


图片来源:极客时间

相关代码如下:

package com.program;


public class Sort {

    /**
     * 冒泡排序
     * 时间复杂度:最好n,最坏情况下n^2
     * 空间复杂度:O(1)
     */
    public void bubbleSort(int[] data) {
        if (data == null || data.length == 0) {
            return;
        }
        int n = data.length;
        int k = 0;
        for (int i = 0; i < n; i++) {
            boolean flag = false;
            //注意这里需要减1,否则会角标越界
            for (int j = 0; j < n - i - 1; j++) {
                k++;
                if (data[j] > data[j + 1]) {
                    int temp = data[j];
                    data[j] = data[j + 1];
                    data[j + 1] = temp;
                    flag = true;
                }
            }
            //如果这一趟没有数据交换了,那么一定是完全有序了。
            if (!flag) {
                break;
            }
        }
        System.out.println("\nk is " + k);
    }

    /**
     * 插入排序
     * 核心思想:将数据分为两部分,一部分是有序的,一部分是无序的,然后将无序的挨个儿往有序里插,插着插着就有感觉了。
     * 空间复杂度:O(1)
     * 时间复杂度:最好n,最坏n^2
     * 说起来简单,实际上很容易出错,just do it
     */
    public void insertionSort(int[] data) {
        if (data == null || data.length == 0) {
            return;
        }
        int n = data.length;
        //外面的循环是无序列表
        int m = 0;
        for (int i = 1; i < n; i++) {
            int value = data[i];
            //为了方便搬动数据,这里最好选择从后往前遍历插
            int j = i - 1;
            //里边的循环是有序列表
            for (; j >= 0; j--) {
                //找到了插入的位置,在插入之前需要搬迁数据
                m++;
                if (value < data[j]) {
                    data[j + 1] = data[j];
                } else {
                    break;
                }
            }
            data[j + 1] = value;
            for (int k = 0; k < data.length; k++) {
                System.out.print(data[k] + " ");
            }
            System.out.println("\n");
        }
        System.out.println("总共执行了" + m + "次");
    }

    /**
     * 选择排序
     * 核心思想:和插入排序很类似,都分为两区,有序区&无序区,只不过不是从无序中往有序中插,
     * 而是从无序中选择一个最小的放在有序区的末尾,over.
     * 空间复杂度:O(1)
     * 时间复杂度:O(n^2)
     * 缺点:不够稳定
     */
    public void selectionSort(int[] data) {
        if (data == null || data.length == 0) {
            return;
        }
        int n = data.length;
        for (int i = 0; i < n; i++) {
            int min = data[i];
            int tempPosition = i;
            //找出最小数的位置
            for (int j = i; j < n - i; j++) {
                if (data[j] < min) {
                    min = data[j];
                    tempPosition = j;
                }
            }
            //最小数添加到后面
            if (tempPosition != i) {
                int temp = data[i];
                data[i] = data[tempPosition];
                data[tempPosition] = temp;
            }
        }
        for (int k = 0; k < data.length; k++) {
            System.out.print(data[k] + " ");
        }
    }


    public static void main(String[] args) {
        int[] data = new int[]{10,9,8,7,6,5,4,3,2,1};
        Sort sort = new Sort();
        //sort.bubbleSort(data);
        //sort.insertionSort(data);
        sort.selectionSort(data);
    }
}
上一篇下一篇

猜你喜欢

热点阅读