zoukankan      html  css  js  c++  java
  • 排序:插入排序

    算法实现

    插入排序(Insertion sort)是一种简单直观且稳定的排序算法。

    插入排序的工作方式非常像人们排序一手扑克牌一样。开始时,我们的左手为空并且桌子上的牌面朝下。然后,我 们每次从桌子上拿走一张牌并将它插入左手中正确的位置。为了找到一张牌的正确位置,我们从右到左将它与已在 手中的每张牌进行比较,如下图所示:

    image-20210804175520649

    排序原理:

    1.把所有的元素分为两组,已经排序的和未排序的;

    2.找到未排序的组中的第一个元素,向已经排序的组中进行插入;

    3.倒叙遍历已经排序的元素,依次和待插入的元素进行比较,直到找到一个元素小于等于待插入元素,那么就把待 插入元素放到这个位置,其他的元素向后移动一位;

    image-20210804175621257

    算法实现:

    /**
     * @author wen.jie
     * @date 2021/8/4 18:00
     */
    public class Insertion {
    
        /**
         * 排序
         * @author wen.jie
         * @date 2021/8/4 17:28
         */
        public static void sort(Comparable<?>[] a) {
            for (int i = 1; i < a.length; i++) {
                for (int j = i; j > 0; j--) {
                    if (greater(a[j-1], a[j])){
                        exchange(a, j-1, j);
                    }else break;
                }
            }
        }
    
        /**
         * 比较
         * @author wen.jie
         * @date 2021/8/4 17:18
         */
        private static boolean greater(Comparable v, Comparable w) {
            return v.compareTo(w) > 0;
        }
    
        /**
         * 交换
         * @author wen.jie
         * @date 2021/8/4 17:27
         */
        private static void exchange(Comparable[] a, int i, int j) {
            Comparable temp = a[i];
            a[i] = a[j];
            a[j] = temp;
        }
    
    }
    

    测试:

            Integer[] arr = {5,4,2,3,6,1};
            Insertion.sort(arr);
            System.out.println(Arrays.toString(arr));
    

    image-20210804180834618

    时间复杂度分析

    插入排序使用了双层for循环,其中内层循环的循环体是真正完成排序的代码,所以,我们分析插入排序的时间复 杂度,主要分析一下内层循环体的执行次数即可。

    最坏情况下:

    比较的次数为:(N-1)+(N-2)+(N-3)+...+2+1=((N-1)+1)*(N-1)/2=N^2/2-N/2;

    交换的次数为:(N-1)+(N-2)+(N-3)+...+2+1=((N-1)+1)*(N-1)/2=N^2/2-N/2;

    总执行次数为:(N^2/2-N/2)+(N^2/2-N/2)=N^2-N;

    按照大O推导法则,保留函数中的最高阶项那么最终插入排序的时间复杂度为O(N^2).

  • 相关阅读:
    0593. Valid Square (M)
    0832. Flipping an Image (E)
    1026. Maximum Difference Between Node and Ancestor (M)
    0563. Binary Tree Tilt (E)
    0445. Add Two Numbers II (M)
    1283. Find the Smallest Divisor Given a Threshold (M)
    C Primer Plus note9
    C Primer Plus note8
    C Primer Plus note7
    C Primer Plus note6
  • 原文地址:https://www.cnblogs.com/wwjj4811/p/15100203.html
Copyright © 2011-2022 走看看