将严节部分的首先个与平稳部分举行相比较.,365体育官网一、直接插入排序

一、直接插入排序

一、间接插入排序

  1. 思想
  1. 思想

直白排序法, 能够分为五个部分, 一部分是有序的, 一部分是冬季的.

直接排序法, 可以分成多少个部分, 一部分是衣冠优孟的, 一部分是冬季的.

365体育官网 1

365体育官网 2

从这么些图上, 应该是能看通晓直接插入排序的考虑了.

从那么些图上, 应该是能看明白直接插入排序的企图了.

将冬日部分的首先个与平稳部分举行比较.

将冬天部分的首先个与平稳部分开展比较.

从静止部分的末端向前方相比较, 然后不断地运动有序部分的数量的岗位

从静止部分的前边向前边相比, 然后持续地运动有序部分的多寡的职位

static void InsertSort(List<int> list)
{
   //从第二个数开始循环, 循环n-1次
    for (int i = 1; i < list.Count; i++)
    {
     //将待排序的数拿出来, 以便后面挪位子
        int temp = list[i];
     //j就是最后确定的那个最大/最小数的下标
        int j = i; 
        while (j >= 1 && temp < list[j - 1])
        {
       //将满足条件的数据向后移动一位, 腾空位, 为插入挪位子
            list[j] = list[j - 1];
            j--;
        }
        list[j] = temp;
    }
}
static void InsertSort(List<int> list)
{
   //从第二个数开始循环, 循环n-1次
    for (int i = 1; i < list.Count; i++)
    {
     //将待排序的数拿出来, 以便后面挪位子
        int temp = list[i];
     //j就是最后确定的那个最大/最小数的下标
        int j = i; 
        while (j >= 1 && temp < list[j - 1])
        {
       //将满足条件的数据向后移动一位, 腾空位, 为插入挪位子
            list[j] = list[j - 1];
            j--;
        }
        list[j] = temp;
    }
}

 

 

  1. 复杂度
  1. 复杂度

直接插入排序的最佳状态下, 时间复杂度为O(n), 最坏情形下,
复杂度为O(n2);

直接插入排序的最佳状态下, 时间复杂度为O(n), 最坏情状下,
复杂度为O(n2);

证明见:

证明见:

插入排序及其复杂度深入分析

插入排序及其复杂度深入分析

 

 

  1. 直接插入排序vs飞快排序
  1. 间接插入排序vs火速排序

365体育官网 3

365体育官网 4

 从地点的代码来看, 直接插入排序供给不停地挪数据. 固然蒙受延续整数,
那么挪动的数据就多了. 针对这种主题素材, 是还是不是可以革新一下直接插入排序?

 从地点的代码来看, 直接插入排序须求持续地挪数据. 假设蒙受接二连三整数,
那么挪动的数量就多了. 针对这种难题, 是还是不是能够创新一下直接插入排序?

在可比的时候, 作者是或不是能够跳着相比?

在对比的时候, 作者是或不是足以跳着相比较?

 

 

二、Hill排序

二、Hill排序

  1. 思想
  1. 思想

在可比的时候, 引进缩短增量相比的格局.

在相比的时候, 引进减少增量比较的格局.

第一步. 使增量d=count/2, 将每隔d个数看成是一组冬季的数,
然后对那组冬辰的数进行插入排序

先是步. 使增量d=count/2, 将每隔d个数看成是一组冬天的数,
然后对这组冬季的数举行插入排序

第二步. 使增量d=d/2, 和第一步推行同一的操作, 一直到d=1的时候

其次步. 使增量d=d/2, 和率先步实践同一的操作, 平素到d=1的时候

365体育官网 5

365体育官网 6

代码:

代码:

static void ShellSort(List<int> list)
{
    int step = list.Count / 2;
    while (step >= 1)
    {
        for (int i = step; i < list.Count; i++)
        {
            var temp = list[i];
            int j = i;
            while (j >= step && temp < list[j - step])
            {
                list[j] = list[j - step];
                j -= step;
            }
            list[j] = temp;
        }
        step = step / 2;
    }
}
static void ShellSort(List<int> list)
{
    int step = list.Count / 2;
    while (step >= 1)
    {
        for (int i = step; i < list.Count; i++)
        {
            var temp = list[i];
            int j = i;
            while (j >= step && temp < list[j - step])
            {
                list[j] = list[j - step];
                j -= step;
            }
            list[j] = temp;
        }
        step = step / 2;
    }
}

希尔排序与直接插入排序, 中间部分的代码基本一向, 分裂的只是维度,
直接插入排序的维度是定点的1,

Hill排序与直接插入排序, 中间有些的代码基本平素, 分化的只是维度,
直接插入排序的维度是定位的1,

而希尔排序的维度是转换的. 从代码上看, 其实照旧蛮简单的,
就拿着直接插入排序改吧改吗就成了.

而Hill排序的维度是生成的. 从代码上看, 其实依旧蛮简单的,
就拿着直接插入排序改吗改吗就成了.

 

 

  1. 复杂度
  1. 复杂度

Hill排序的小时复杂度, 和直接插入排序的最佳&最坏时间复杂度居然是同一的,
同志们, 能相信么.

Hill排序的年月复杂度, 和直接插入排序的最棒&最坏时间复杂度居然是均等的,
同志们, 能相信么.

 

 

三、直接插入排序 vs Hill排序

三、直接插入排序 vs Hill排序

既是说Hill排序是直接插入排序的革新版, 那么她们到底什么人更决心些呢?
会不会越改越差了?

既是说Hill排序是直接插入排序的创新版, 那么她们到底何人更决心些吗?
会不会越改越差了?

static void Test()
{
    //五次比较
    for (int i = 1; i <= 5; i++)
    {
        List<int> list = new List<int>();
        List<int> listA = new List<int>();
        //插入2k个随机数到数组中
        for (int j = 0; j < 10000; j++)
        {
            Thread.Sleep(1);
            list.Add(new Random((int)DateTime.Now.Ticks).Next(0, 100000));
        }

        listA.AddRange(list);
        Console.WriteLine("\n第" + i + "次比较:{0}...", string.Join(",", list.Take(10)));

        Stopwatch watch = new Stopwatch();
        watch.Start();
        InsertSort(list);
        watch.Stop();
        Console.WriteLine("\n直接插入排序耗费时间:" + watch.ElapsedMilliseconds);
        Console.WriteLine("输出前是十个数:" + string.Join(",", list.Take(10).ToList()));

        watch.Restart();
        ShellSort(listA);
        watch.Stop();
        Console.WriteLine("\n希尔排序耗费时间:" + watch.ElapsedMilliseconds);
        Console.WriteLine("输出前是十个数:" + string.Join(",", listA.Take(10).ToList()));
    }
}
static void Test()
{
    //五次比较
    for (int i = 1; i <= 5; i++)
    {
        List<int> list = new List<int>();
        List<int> listA = new List<int>();
        //插入2k个随机数到数组中
        for (int j = 0; j < 10000; j++)
        {
            Thread.Sleep(1);
            list.Add(new Random((int)DateTime.Now.Ticks).Next(0, 100000));
        }

        listA.AddRange(list);
        Console.WriteLine("\n第" + i + "次比较:{0}...", string.Join(",", list.Take(10)));

        Stopwatch watch = new Stopwatch();
        watch.Start();
        InsertSort(list);
        watch.Stop();
        Console.WriteLine("\n直接插入排序耗费时间:" + watch.ElapsedMilliseconds);
        Console.WriteLine("输出前是十个数:" + string.Join(",", list.Take(10).ToList()));

        watch.Restart();
        ShellSort(listA);
        watch.Stop();
        Console.WriteLine("\n希尔排序耗费时间:" + watch.ElapsedMilliseconds);
        Console.WriteLine("输出前是十个数:" + string.Join(",", listA.Take(10).ToList()));
    }
}

365体育官网 7

365体育官网 8

从结果上看, Hill排序的创新效果照旧蛮鲜明的.
不过希尔排序实际不是贰个安定的排序情势. 也便是说,
依然也许出现比神速排序慢的时候.

从结果上看, Hill排序的革新效果如故蛮分明的.
可是Hill排序并非贰个安居的排序方式. 也正是说,
照旧可能出现比火速排序慢的时候.

 

 

相关文章