美文网首页
【数据结构】【C#】013-插入类排序:🥇直接插入排序(稳定)

【数据结构】【C#】013-插入类排序:🥇直接插入排序(稳定)

作者: lijianfex | 来源:发表于2018-10-14 17:14 被阅读43次

插入排序:直接插入排序(稳定)

【 算法思想 】 直接插入排序是一种最基本的插入排序方法,其基本操作是将第 i 个记录插入到前面 i-1 个已排好序的记录中。具体过程为:将第 i 个记录的关键字 K i ,顺次与其前面记录的关键字 K i-1 ,K i-2 ,…, K 1 进行比较,将所有关键字大于 K i 的记录依次向后移动一个位置,直到遇见一个关键字小于或者等于 K i 的记录 K j ,此时 K j 后面必为空位置,将第 i 个记
录插入空位置即可。完整的直接插入排序是从 i=2 开始,也就是说,将第 1 个记录视为已排好序的单元素子集合,然后将第二个记录插入到单元素子集合中。i 从 2 循环到 n,即可实现完整的直接插入排序。

我们经常会到这样一类排序问题:把新的数据插入到已经排好的数据列中。将第一个数和第二个数排序,然后构成一个有序序列将第三个数插入进去,构成一个新的有序序列。对第四个数、第五个数……直到最后一个数,重复第二步。如题所示:

来自网络

直接插入排序(Straight Insertion Sorting)的基本思想:在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。


C#实现:

/// <summary>
/// 自定义工具类
/// </summary>
public static class Utilit
{
    /// <summary>
    /// 辅助输出排序结果:
    /// </summary>
    /// <param name="a"></param>
    /// <param name="t"></param>
    public static void Print(int[] a, int t)
    {
        string str = null;
        for (int i = 0; i < a.Length; i++)
        {
            str += a[i].ToString() + " ";
        }
        Debug.Log("第" + t + "趟排序结果:" + str);
    }

    /// <summary>
    /// 辅助生成排序结果
    /// </summary>
    /// <param name="max"></param>
    /// <param name="length"></param>
    /// <returns></returns>
    public static int[] RandArray(int max, int length)
    {
        string str = null;
        int[] a = new int[length];
        for (int i = 0; i < a.Length; ++i)
        {
            a[i] = Random.Range(0, max);
            str += a[i].ToString() + " ";
        }
        Debug.Log("随机生成的数组:" + str);
        return a;
    }
}

上方为产生随机数组与打印排序数组的工具类

直接插入排序:


/// <summary>
/// 插入排序类
/// </summary>
public class InsertSort
{
    /// <summary>
    ///1、 直接插入排序法:
    /// </summary>
    /// <param name="a"></param>
    public static void StraightInsetSort(int[] a)
    {
        int insertNum;//要插入的数
        int len = a.Length;//数组长度

        for (int i = 1; i < len; i++) //从第2个数,进行插入排序
        {
            insertNum = a[i];

            int j = i - 1; //前一个数的索性值

            while (j >= 0 && insertNum < a[j])
            {
                a[j + 1] = a[j]; //把大的向后移动
                j--;
            }

            a[j + 1] = insertNum;//找到位置,插入当前元素

            Utilit.Print(a, i);//输出每趟的排序的结果
        }

    }

}

测试用例:

public class _012_InsertSort : MonoBehaviour
{


    void Start()
    {
        int[] a = Utilit.RandArray(20, 10); //max,lenght

        Debug.Log("------------直接插入排序----------------");
        InsertSort.StraightInsetSort(a); //直接插入排序

    }
}

输出结果:

插入排序:直接插入排序

注:

1、直接插入排序的时间复杂度为 T(n)=O(n 2 ),空间复杂度为 S(n)=O(1)。

2、稳定排序算法

3、直接插入排序算法简便,比较适用于待排序记录数目较少基本有序的情况。当待排记录数目较大时,直接插入排序的性能就不好,因此可以对直接插入排序做进一步的改进。在直接插入排序法的基础上,从减少“比较关键字”“移动记录”两种操作的次数着手来进行改进。

image.png

相关文章

  • 【数据结构】【C#】013-插入类排序:🥇直接插入排序(稳定)

    插入排序:直接插入排序(稳定) 【 算法思想 】 直接插入排序是一种最基本的插入排序方法,其基本操作是将第 i 个...

  • 七大排序算法总结

    题记: 直接插入排序(稳定)-->希尔排序 : 属于插入排序 简单选择排序(稳定)-->堆排序 :属于选择排序...

  • 排序算法时间复杂度对比

    内排序主要分为四类:插入排序类、选择排序类、交换排序类、归并排序类。 插入排序类 直接插入排序 希尔排序 选择排序...

  • 排序

    插入排序 直接插入排序 折半插入排序 希尔排序(不稳定的排序):取d每个数隔d个比较排序,比如:1.45.6.67...

  • 排序算法时间复杂度、空间复杂度、稳定性比较

    一、排序算法的分类 1.插入类排序直接插入排序,折半插入排序,希尔排序2.交换类排序冒泡排序,快速排序3.选择类排...

  • 你要的排序算法

    排序分多种,插入排序类有直接插入排序,希尔排序;选择排序类有简单选择排序,堆排序;交换排序类有冒泡排序,快速排序。...

  • 插入排序

    插入排序也是一类非常常见的排序方法,它主要包含直接插入、折半插入和Shell排序等几种常见排序方法。 直接插入排序...

  • 算法

    插入排序 稳定排序

  • 算法导论阅读笔记4-快速排序

    Note:堆排序、快速排序、希尔排序、直接选择排序不是稳定的排序算法,而基数排序、冒泡排序、直接插入排序、折半插入...

  • 算法(排序)

    一、内部排序 1、插入排序—直接插入排序(Straight Insertion Sort) 2、插入排序—希尔排序...

网友评论

      本文标题:【数据结构】【C#】013-插入类排序:🥇直接插入排序(稳定)

      本文链接:https://www.haomeiwen.com/subject/iqftzftx.html