zoukankan      html  css  js  c++  java
  • 排序算法之直接插入排序

    1、基本思想

      在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经有序的,现在要把第n个数插到前面的有序数中,使得这n个数也是有序的。如此反复循环,直到全部排好顺序。这个思想类似打扑克的时候抓牌的情形。

    2、代码示例

    package  sort;
    
    public class InsertSort {
    
        public void TestSort() {
            int a[]={49,38,65,97,76,13,27,49,78,34,34,15,35,25,53,51}; 
            sort(a);
        }
        
        public void sort(int arr[]) {
            int i, j;
            //数组长度。
            int len = arr.length; 
            //临时变量,用于存放当前插入的元素。
            int temp;
            //假定第一个元素arr[0]已经在正确的位置上。
            //则仅需遍历 arr[1]-arr[n-1]列表。
            for (i = 1; i < len; i++) {
                //对于每次遍历,从arr[0]-arr[i-1]范围内的元素已经是有序的。
                //每次遍历的任务是:通过循环前面已排序的子列表,将arr[i]的元素插入到从arr[0]到a[i-1]列表中的正确位置上。
                j = i;
                //将arr[i]复制给temp。
                temp = arr[i];
                //向前循环列表,比较temp与arr[j-1]、arr[j-2]...的大小。
                //当temp大于或等于arr[j-1]或者在列表开始处结束。
                while (j > 0 && temp < arr[j - 1]) {
                    //满足条件,arr[j-1]元素向后移一位。
                    arr[j] = arr[j - 1];
                    j--;
                }
                //循环结束,将temp复制给arr[j]
                arr[j] = temp;
            }
            for (i = 0; i < arr.length; i++){
                System.out.print(arr[i] + " ");
            }
        }
    }

    3、效率分析

      空间复杂度O(1)

      时间复杂度O(n2)

      最差情况:反序,需要移动n*(n-1)/2个元素

      最好情况:正序,不需要移动元素

      数组在已排序或者是“近似排序”时,插入排序效率的最好情况运行时间为O(n)

      插入排序最坏情况运行时间和平均情况运行时间都为O(n2)

  • 相关阅读:
    python记录程序运行时间的三种方法
    LeetCode 922. 按奇偶排序数组 II 做题小结
    LeetCode 976. 三角形的最大周长 做题小结
    LeetCode 1122. 数组的相对排序 做题小结
    LeetCode1528. 重新排列字符串 做题小结
    LeetCode 738. 单调递增的数字 做题小结
    selenium——鼠标操作ActionChains:点击、滑动、拖动
    剑指 Offer 32
    剑指 Offer 32
    二叉树的应用:二叉排序树的删除
  • 原文地址:https://www.cnblogs.com/hehaiyang/p/4754479.html
Copyright © 2011-2022 走看看