• 选择排序和插入排序


    1.选择排序

      1.何为选择排序:

        以升序为例:

        1.将数组分为两个子集,排序的和未排序的,每一轮从未排序的子集中选出最小的元素,放入排序子集.

        2.重复上述步骤,知道数组有序

      2.优化方式

        1.为减少交换次数,每一轮可以先找到最小的索引,再每轮最后交换元素的位置

      3.与冒泡排序比较

        1.两者的时间复杂度都为O(n²)

        2.选择排序一般快于冒泡排序,因为其交换次数少

        3.但如果集合有序度高,冒泡优于选择

        4.冒泡属于稳定排序算法,而选择属于不稳定排序算法

    /**
     * 选择排序
     */
    public class SelectSort {
        public static void main(String[] args) {
            // 原始数据
            int[] arr = {1,4,2,7,5,8,9};
            // 选择排序方法
            selectSort(arr);
        }
    
        private static void selectSort(int[] arr) {
            // 需要执行的轮次
            for (int i = 0; i < arr.length-1; i++) {
                // i 代表每轮最小元素需要交换到的索引
                int s = i;
                for (int j = s + 1; j < arr.length; j++) {
                    // 和数组每个元素比对
                    if (arr[s] > arr[j]) {
                        // 给最小元素索引赋值
                        s = j;
                    }
                }
                // 判断本轮最小元素是否就是本轮的索引i,如果不是说明发生了交换
                if (s != i) {
                    swap(arr,s,i);
                }
                System.out.println(Arrays.toString(arr));
            }
        }
    
        public static void swap(int[] arr,int i,int j) {
            int t = arr[i];
            arr[i] = arr[j];
            arr[j] = t;
        }
    
    }

    2.插入排序

      1.何为插入排序

        1.将数组分为两个区域,排序区域和未排序区域,每一轮从未排序区域中取出第一个元素,插入到排序区域(需要保证顺序)

        2.重复上述步骤,直到整个数组有序

      2.优化方式

        1.待插入元素进行比较时,遇到比自己小的元素,就代表找到了插入位置,无需进行后续比较

        2.插入时可以直接移动元素,而不是交换元素

      3.与选择排序比较

        1.两者平均时间复杂度都是O(n²)

        2.大部分情况下插入都略优于选择

        3.有序集合插入的时间复杂度是O(n)

        4.插入是稳定排序算法,选择是不稳定排序算法

    /**
     * 插入排序
     */
    public class InsertSort {
        public static void main(String[] args) {
            // 原始数据
            int[] arr = {1,4,2,7,5,8,9};
            // 插入排序
            insertSort(arr);
        }
    
        private static void insertSort(int[] arr) {
            // i代表插入元素的索引
            for (int i = 1; i < arr.length; i++) {
                // t代表要插入元素的值
                int t = arr[i];
                // j代表已排序的元素索引
                int j = i - 1;
                // 如果数组第一个元素也比完了就跳过比较循环
                while (j >= 0) {
                    // 如果要插入的元素小于最后一个已排序的元素
                    if (t < arr[j]) {
                        // 最后一排元素往后移一位
                        arr[j + 1] = arr[j];
                    }else {
                        //如果改值没有比当前要插入元素小就跳出循环
                        break;
                    }
                    // 已排元素索引往前移一个,让要插入的元素继续与上一个已排元素比较
                    j--;
                }
                // 把要插入的元素插入到最后比较的元素位置
                arr[j + 1] = t;
                System.out.println(Arrays.toString(arr));
            }
        }
    }
  • 相关阅读:
    vue中计算属性computed和watch的区别
    sqlserver中pivot(行转列),unpivot(列转行)
    js本地缓存的方式Cookie、localStorage、sessionStorage
    Linux调度系统全景指南(中篇)
    Linux调度系统全景指南(终结篇)
    Linux调度系统全景指南(下篇)
    五层模型
    Linux内核概念
    网络性能
    PyMuPDF使用
  • 原文地址:https://www.cnblogs.com/xuxiaobai13/p/15428081.html
Copyright © 2020-2023  润新知