• 秒懂算法3——插入排序(C#实现)


    算法思路:

    将n个元素分成【已排序】和【未排序】两部分。每次将【未排序】中的一个元素取出,插入到已排序中的相应位置。直至所有元素排序完毕。

      【已排序】        【未排序】

      { { a[0] }               ,   { a[1],a[2],a[3]....a[n-1] } }

      { { a[0] , a[1] }   ,   { a[2],a[3] ....a[n-1] }   }

      { { a[0] ,a[1],a[2] } ,   { a[3]......a[n-1] }     }

    性质:

    插入排序是一种原地排序(只有常数个元素存到数组以外的空间),平均时间复杂度和最坏的时间复杂度都是n2。且它是稳定的排序算法

    代码如下:

    static void Main(string[] args)
            {
                var a= new int[]{5,3,1,9,4,32,2};
     
                
                for (int i = 1; i < a.Length; i++)    //外层循环:遍历数组,从第二个元素开始
                {
                    int num= a[i];      //将待插入元素存入num
                    int index = i;      //记录待插入元素下标
    
    
                    for (int j = i-1; j >= 0; j--)   //内层循环:遍历待【插入元素之前】所有已经排好顺序的数组
                    {
                        if( num < a[j])  // *如果待插入元素小于前一个元素,向后赋值一位*
                        {
                                    a[index] = a[index -1];
                                    index--;
    
                        }
                        else if (num >= a[j]) { break; } //找到插入位置,跳出内层循环
    
                    }
                    a[index] = num;    //插入到相应位置
    
                }
    
                foreach (var item in a)
                { Console.Write("	" + item); }
    
                Console.Read();
            }

    直观示意:

    当原数组:{5,3,1,9,4,32,2}           前四位已经排好变成: {1,3,5,9,4,32,2} 的时候,该排4了, 数组的实际变化如下。

  • 相关阅读:
    C macro : the " do { ... } while(0)" magic
    sscanf()函数
    poj-1200-hash-
    hduoj-1735 简单的贪心算法
    hduoj -2570-简单的贪心算法入门
    分治算法应用-最近点对的最小距离-hdu 1007 Quoit Design
    分治算法(转载)
    快速幂总结
    poj 1065 贪心算法
    toj ~3988~递归二叉树三种遍历的转换
  • 原文地址:https://www.cnblogs.com/hydor/p/3523448.html
Copyright © 2020-2023  润新知