三大基础排序之——插入排序

来源:互联网 发布:班班通教学软件下载 编辑:程序博客网 时间:2024/06/06 09:36

前言:

        中国人很喜欢玩扑克牌,在我们摸牌的过程中就承载了这么一个思想,当扑克牌没有在我们手中的时候它是没有顺序的,几个人轮流摸牌。现在你手里已经有两张扑克牌了,我们会下意识的把下一次摸到的小的牌放在左边,摸到的大的排放到右边。而这个“下意识”就是我们在对我们手上的扑克牌进行了一个简单的插入排序。

基本原理:

       输入一个元素,检查数组列表中的每个元素,将其插入到一个已经排好序的数列中的适当位置,使数列依然有序,当最后一个元素放入合适位置时,该数组排序完毕。

步骤 拆解:

1.从第一个元素开始,该元素可以认为已经被排序

2.取出下一个元素,在已经排序的元素序列中从后向前扫描

3.如果该元素(已排序)大于新元素,将该元素移到下一位置

4.重复步骤3,直到找到已排序的元素小于或者等于新元素的位置

5.将新元素插入到该位置后

6.重复步骤2~5

动态演示

                             

时间复杂度及稳定性

最坏情况:O(N^2)

最好情况:O(N)

稳定性:不稳定 

分析:

       在最坏情况下,数组完全逆序,插入第2个元素时要考察前1个元素,插入第3个元素时,要考虑前2个元素,……,插入第N个元素,要考虑前 N - 1 个元素。因此,最坏情况下的比较次数是 1 + 2 + 3 + ... + (N - 1),等差数列求和,结果为 N^2 / 2,所以最坏情况下的复杂度为 O(N^2)。

       最好情况下,数组已经是有序的,每插入一个元素,只需要考查前一个元素,因此最好情况下,插入排序的时间复杂度为O(N) 。

       稳定性,对于有序区并不是完全有序,在排序的过程中会不断的在有序的任何位置插入一个新的元素,有序区的元素并不是完全不变的,所以所说插入排序是不稳定的。

代码

namespace 插入排序{    class Program    {        static void Main(string[] args)        {            //初始化            int i;            int j;            swap swap = new swap();            int[] Array = new int[10];            Random ran = new Random();                  //实例化产生随机数的变量            int n = Array.Length-1;            Console.WriteLine("\n            插入排序   大—>小\n");            Console.Write("       【原始数列】:");            //自动产生0~100的随机数  并显示            for ( i = 0; i < n; i++)            {                Array[i] = ran.Next(0, 100);            // 给数组赋值                Console.Write(Array[i] + " ");            //打印产生的随机数,显示在屏幕上            }            Console.WriteLine();            //*********************************************************************************************************************************            //从大到小排序            for ( i = 1; i < n; i++)            {                if (Array[i] > Array[i - 1])             //待排元素是否在有序区里                {                    int temp = Array[i];                    //把待排元素的值拿出来                    for (j = i - 1; j >= 0; j--)                    {                        if (temp < Array[j]) break;                        Array[j + 1] = Array[j];          //所有数组下标向后一个,值不变                     }                    Array[j + 1] = temp;                   //将待排元素插入 找到的位置                 } //*********************************************************************************************************************************** //显示排序过程                Console.WriteLine();                Console.Write("第" + i + "趟后,排序结果为:");                for (int z = 0; z < n; z++)                {                    Console.Write(Array[z] + " ");                }            }            //输出排序后的数列            Console.WriteLine();            Console.WriteLine();            Console.Write("   【排序后的数列】:");            for (i = 0; i < n; i++)            {                Console.Write(Array[i] + " ");            }            Console.ReadLine();        }    }}


总结:

        该博客主要讲解插入排序的基本原理,时间复杂度,实现过程,及其代码实,仅供参考,如若有理解不对的地方,还请指出来,以便更正,共同学习,共同进步。


原创粉丝点击