zoukankan      html  css  js  c++  java
  • 排序算法系列之插入排序 (1)

    排序,即是以一定的规则组织数据,排序算法的优劣关键在于比较数据的交换和移动次数.

    排序算法需要考虑的几点:数据交换次数,移动次数,数据越界,算法的实用性(符合多种类型)

    //预知:使用C#拓展方法进行数据输出,使用StringBuilder节约内存开销
    
        public static  class DebugExtension
        {
            public static void DebugArray<T>(T[] array)
            {
                StringBuilder sb = new StringBuilder(array.Count() *2);
                for (int i = 0; i < array.Count(); i++)
                {
                    sb.Append(array[i]);
                    sb.Append(",");
                }
                Console.WriteLine(sb);
            }
        }

     

    以下排序算法规则皆从左到右,从小到大进行数据排序:

    一、插入排序

      1. 插入排序首先考虑数组前两个元素data[0]和data[1]之间数据大小,如果data[0] > data[1],则进行交换;
      2. 然后考虑下一位data[2],在第一次排序后,data[0]和data[1]已经是有序的了,那么data[2]只需要跟左边的data[1]依次比较,是否顺序颠倒,需要交换;如果需要交换,那么data[2] <=> data[1] , 此时位于data[1]的数据再跟左边的数据data[0]进行比较是否需要交换,以此类推;
      3. 每次迭代过程,需要排序的数据data[j]左边的所有数据都已经是有序数据了,就像打扑克一样,把data[j]每次把需要排序的数据移动到左边适合位置i,需要从i 到 j-1 这段有序数据都需要依次向右移动一位,然后把保存的tamp数据插入data[i];
      4. 从数组的第二个数开始迭代,直到迭代到最后一位n对左侧已经排序好的数据进行插入排序,排序完成
      5. 代码如下:
        public  void InsertionSort<T>(T[] datas) where T :IComparable<T>
            {
                for (int i = 0; i < datas.Count() - 1; i++)
                {
                    int temp;
        
                    for (int j = i; j >= 0; j--)
                    {
                        if (datas[j] > datas[j + 1])
                        {
                            temp = datas[j + 1];
                            datas[j + 1] = datas[j];
                            datas[j] = temp;
                        }
                    }
                } 
            }
    代码2:
    public  void InsertionSort<T>(T[] datas) where T :IComparable<T>
        {
            if (datas == null) return;
    
            // 第一轮比较N-1次,从 第二个数到最后一个数,每次依次和左侧相比
            for (int i = 1 , j; i < datas.Count(); i++)
            {
                T temp = datas[i];
                for (j = i; j > 0 && temp.CompareTo(datas[j - 1]) < 0; j--)
                {
                    datas[j] = datas[j - 1];
                }
                datas[j] = temp;
    
            }
        }
    待排序数组如下:
    int[] insertDatas = { 5, 7, 3, 5, 2, 11, 90, 4, 2, 1, 3 };
            Program program = new Program();
            program.InsertionSort(insertDatas);
            DebugExtension.DebugArray(insertDatas);
    1. 结果输出:image
  • 相关阅读:
    Codeforces 893E Counting Arrays:dp + 线性筛 + 分解质因数 + 组合数结论
    Codeforces 938E Max History:排列 + 逆元【考虑单个元素的贡献】
    Codeforces 859E Desk Disorder:并查集【两个属性二选一】
    Codeforces 869C The Intriguing Obsession:组合数 or dp
    Codeforces 888D Almost Identity Permutations:错排公式
    Codeforces 870E Points, Lines and Ready-made Titles:并查集【两个属性二选一】
    Codeforces 895C Square Subsets:状压dp【组合数结论】
    leetcode
    hdu6578 2019湖南省赛D题Modulo Nine 经典dp
    Codechef March Cook-Off 2018. Maximum Tree Path
  • 原文地址:https://www.cnblogs.com/liaoguipeng/p/5279105.html
Copyright © 2011-2022 走看看