• [算法学习笔记]直接插入排序笔记


    直接插入排序概念:

    带排元素放在elem[0...n-1]中,初始化时,elem[0]自成1个有序区,无序区为elem[1...n-1],从i=1起,到i=n-1,依次将elem[i]插入有序区[0...n-1]中

    直接插入排序算法步骤:

    1.在当前有序区域R[1,i-1]中查找R[i]的正确插入位置K(1<=K<=i-1)

    2.将R[K,i-1]中的记录均向后移动

    3.移动后腾出K位置,插入R[i]

    (最坏)时间复杂度:O(n^2)

    空间复杂度:O(1)

            /// <summary>
            /// 步骤:(正序)
            /// 1.从带排序列中获取待排元素,记录
            /// 2.依次比较有序集合中的各个元素(从有序集合中的最后一个开始向前比较)
            /// 3.如果待插入元素小与比较元素,则比较元素向后移动一个位置
            /// 3.否则结束内层循环,此时的下标j+1则为待排元素的位置
            /// 
            /// 关键点:
            /// 1.第一个元素被当做是有序序列,故从i=1开始排序
            /// 2.待排元素与有序元素的比较是从有序序列的最后一个元素开始比
            /// 3.在有序序列中,一旦遇到比等排元素小的,则本次比较即为停止,j+1就是待排元素位置
            /// 
            /// [0][1][2][3][4][5][6]
            /// 
            /// 88 16 8 27 24 49 78
            /// 
            /// 88 16 8 27 24 49 78
            /// 
            /// 16 88 8 27 24 49 78
            /// 
            /// 8 16 88 27 24 49 78
            /// 
            /// 8 16 27 88 24 49 78
            /// 
            /// 8 16 24 27 88 48 78
            /// 
            /// 8 16 24 27 48 88 78
            /// 
            /// 8 16 24 27 49 78 88
            /// </summary>
            /// <param name="elements"></param>
            static void InsertSort(int[] elements)
            {
                int i;
                int j;
    
                for (i = 1; i < elements.Length; i++)
                {
                    //记录需要插入的数据(带排元素)
                    int standBy = elements[i];
    
                    // 内层循环是遍历有序序列
                    // 从有序序列中的最后一个开始比较
                    for (j = i - 1; j >= 0; j--)
                    {
                        // 如果待排元素比有序元素小,则向后移动
                        if (standBy < elements[j])
                            elements[j + 1] = elements[j];
                        else // 一旦条件不成立,则视为找到目标位置
                            break;
                    }
    
                    elements[j + 1] = standBy;
                }
            }
            static void Main(string[] args)
            {
                int[] elements = { 88, 68, 25, 6, 12, 57, 78, 12 };
    
                // 调用直接插入排序
                InsertSort(elements);
                
                foreach(int e in elements)
                {
                    Console.Write( e + " ");
                }
            }
  • 相关阅读:
    CF1260F
    牛客挑战赛34 A~E
    CSP-S2019游记&拆塔记
    6424. 【NOIP2019模拟2019.11.13】我的订书机之恋
    CF1257E/F
    6423. 【NOIP2019模拟11.11】画
    1222/2516. Kup
    Comet OJ
    浅析CSS定位
    css文字颜色渐变的3种实现
  • 原文地址:https://www.cnblogs.com/hellenism/p/3726441.html
Copyright © 2020-2023  润新知