首页 > 编程语言 > 详细

冒泡排序、选择排序和插入排序

时间:2020-10-07 10:19:42      阅读:35      评论:0      收藏:0      [点我收藏+]

冒泡排序

  • 时间复杂度O(n2)、空间复杂度O(1)、稳定、原地排序

  • 冒泡排序就是比较与自己相邻的下一个数,如果下一个数比这个大,就交换,否则就进行下一个比较了,经过一轮,大的就会排到最后面去了,循环a.length - 1次即可,注意的是,每次比较只需要比较到倒数第二个,因为最后一个没有下一个与它进行比较了,所以循环a.length-1次

  • 技术分享图片

  • 代码如下

    import java.util.Arrays;
    
    /**
     * @Description: 冒泡排序
     * @Author: LinZeLiang
     * @Date: 2020-10-04
     */
    public class BubbleSort {
        public static void main(String[] args) {
            int[] a = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
    
            bubbleSort(a);
    
            System.out.println(Arrays.toString(a));
        }
    
        public static void bubbleSort(int[] a) {
            //优化冒泡排序,用flag来做标记
            boolean flag = true;
            //外层循环只会循环length-1次,因为到达最后一个就不用排序了
            for (int i = 0; i < a.length - 1 && flag; i++) {
                flag = false;
                for (int j = 0; j < a.length - 1 - i; j++) {
                    if (a[j] > a[j + 1]) {
                        //交换两个位置,让大的在右边
                        int temp = a[j];
                        a[j] = a[j + 1];
                        a[j + 1] = temp;
                        //只有当有交换的时候才说明无序,falg变成true,接着进行下一次排序,否则说明都已经是有序的,无需再排序了
                        flag = true;
                    }
                }
            }
        }
    }
    

选择排序

  • 时间复杂度O(n2)、空间复杂度O(1)、稳定、原地排序

  • 选择排序,顾名思义就是选择最大(最小)将其与右端(左端)进行交换,如果是本身,则无需交换。如此往复,直到剩下一个,就排序好了。

  • 技术分享图片

  • 代码如下

    import java.util.Arrays;
    
    /**
     * @Description: 选择排序(非稳地排序、原地排序、时间复杂度O(n2)、空间复杂度O(1))
     * @Author: LinZeLiang
     * @Date: 2020-10-04
     */
    public class SelectSort {
    
        public static void main(String[] args) {
            int[] a = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
    
            selectSort(a);
    
            System.out.println(Arrays.toString(a));
        }
    
        public static void selectSort(int[] a) {
            //只需要排length-1次即可,最后一个不用排序
            for (int i = 0; i < a.length-1; i++) {
                //不需要记录最大值,只需要记录角标即可
                int pos = 0;
                for (int j = 1; j < a.length - i; j++) {
                    if (a[j] > a[pos]) {
                        pos = j;
                    }
                }
    
                //如果最后一个就是最大的则无需排序
                if (a.length - 1 - i != pos) {
                    int temp = a[a.length - 1 - i];
                    a[a.length - 1 - i] = a[pos];
                    a[pos] = temp;
                }
            }
        }
    }
    

插入排序

  • 时间复杂度O(n2)、空间复杂度O(1)、不稳定、原地排序

  • 插入排序类似我们在打扑克牌时候,选最左边的为基准,大于他的插入到右边,小于他的插入到左边,慢慢的变有序。即将数字插入到已经有序的数组中适当的位置。插入排序适用于小规模和比较有序的数组排序。

  • 技术分享图片

  • 代码如下

    import java.util.Arrays;
    
    /**
     * @Description: 插入排序
     * @Author: LinZeLiang
     * @Date: 2020-10-04
     */
    public class InsertSort {
    
        public static void main(String[] args) {
            int[] a = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
    
            insertSort(a);
    
            System.out.println(Arrays.toString(a));
        }
    
        public static void insertSort(int[] a) {
            //因为以第一个为基准,所以第一个不用排序,直接从第二个开始,即角标为1
            for (int i = 1; i < a.length; i++) {
    
                //只有比前面的小才进行排序
                if (a[i] < a[i - 1]) {
                    //设置哨兵,先把待排序的值记录下来
                    int temp = a[i];
                    int j;
    
                    //如果已排序好的数比当前要排序的数大,则需要将该书往后移一位,然后继续比较前一位和待排序的数的大小
                    //j为i-1即从前一个开始比较,直到比他的值比i的大才插入,否则先后移一位
                    for (j = i - 1; j >= 0 && a[j] > temp; j--) {
                        a[j + 1] = a[j];
                    }
                    a[j + 1] = temp;
                }
            }
        }
    }
    

冒泡排序、选择排序和插入排序

原文:https://www.cnblogs.com/linzedian/p/13776049.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!