美文网首页
冒泡、插入、选择排序算法

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

作者: 匿名用户_bcc3 | 来源:发表于2018-11-03 15:04 被阅读0次

冒泡、插入、选择排序是最基础的三种算法,这三种算法的最差复杂度都是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);
    }
}

相关文章

  • 图形化排序算法比较:快速排序、插入排序、选择排序、冒泡排序

    图形化排序算法比较:快速排序、插入排序、选择排序、冒泡排序 图形化排序算法比较:快速排序、插入排序、选择排序、冒泡排序

  • 排序一:冒泡、插入、选择

    文章结构 概述 冒泡排序 插入排序 选择排序 1. 概述 常见的排序算法有:冒泡排序、插入排序、选择排序、归并排序...

  • OC常用算法

    排序算法 冒泡排序 选择排序 快速排序 插入 二分查找

  • 算法之:排序

    排序算法 冒泡排序 选择排序 快速排序 插入 二分查找

  • Chapter 2 Foundation of Algorith

    Chapter 2 插入排序 线性查找 选择算法 归并排序算法 二分查找算法 冒泡排序 插入排序 循环不...

  • PHP算法系列教程(一)-四大排序算法

    PHP算法系列教程(一)-四大排序算法 冒泡 冒泡排序原理图 选择 选择排序原理图 插入 插入排序原理图 快排 快...

  • JAVA数据结构和算法——简单排序

    冒泡排序 选择排序 插入排序 排序算法的选择 除非手边没有算法书可参考,一般情况几乎不太用冒泡排序。选择排序虽然把...

  • 排序算法

    常见的排序算法 常见的排序算法有:插入、希尔、选择、冒泡、归并、快速、堆排序。。。 插入排序 算法步骤一、从数组的...

  • noip普及组3:排序算法

    排序算法 ①冒泡排序:O() ②插入排序:O() ③选择排序:O() ④桶排序 ⑤sort排序

  • 排序算法

    排序算法 冒泡排序 选择排序 插入排序 快速排序(最常见) 希尔排序 归并排序 源码:Sorting 冒泡排序 冒...

网友评论

      本文标题:冒泡、插入、选择排序算法

      本文链接:https://www.haomeiwen.com/subject/ybmkxqtx.html