十大经典排序算法之插入排序

插入排序

**说起排序算法,最先要说的就是插入排序。**因为它简单且稳定。

那么什么是插入排序呢?

例如:

  • 有一组数据已经有序(不论升序降序)的排列好了,这时候我们需要在这组数据中再插入一个数据,并且要求该组数据依然有序,那么这个时候我们就可以使用插入排序算法解决问题。
  • 算法思想(我们以数组的操作举例(升序)):
    1.首先,包含两个以上元素的数组才需要排序。所以我们就从数组的第二个元素开始。
    2.将我们选择出来的元素与它左边的元素依次比较,如果左边第一个元素比它大,则比较左边第二个,直到遇到比他小的,就插到这个元素的右边。
    3.然后就这样往后选取元素重复上面的步骤。
  • 当然,如果你看上面的文字觉得干巴巴的有点晦涩,看不懂是个什么玩意儿。博主还为你准备了下面的代码示例,希望两者对比着看可以对你有所帮助。
    代码示例如下(C#实现):

			//定义一个整型数组
            int[] arr01 = new int[] { 5, 6, 4, 1, 3, 8, 9, 0, 2, 7 };

            //第一种方式
            //我们定义一个变量temp用来交换值
            int temp01;

            //从角标1也就是第二个元素开始
            for (int i = 1; i < arr01.Length; i++)
            {
                //将我们选择出来的元素与它左边的元素依次比较
                for (int j = i; j > 0; j--)
                {
                    //满足条件就交换两数位置
                    if (arr01[j] < arr01[j - 1]) 
                    {
                        temp01 = arr01[j];
                        arr01[j] = arr01[j - 1];
                        arr01[j - 1] = temp01;
                    }
                }
            }

            //打印看看是否正确
            Console.WriteLine("排序后的数组为:");
            for (int i = 0; i < arr01.Length; i++)
            {
                Console.Write(arr01[i] + " ");
            }
            

好,上面这种方法能够实现我们的插入排序,可是我们可以看到,每次判断为真之后都要进行两数交换,这一操作过于频繁。下面我们就针对这里进行优化,请看第二种实现方法:

代码示例如下(C#实现):


			//定义一个整型数组
            int[] arr01 = new int[] { 5, 6, 4, 1, 3, 8, 9, 0, 2, 7 };

            //第二种方式

            //从角标1也就是第二个元素开始
            for (int i = 1; i < arr01.Length; i++)
            {
                //进入第一层循环,我们先定义两个变量temp,index
                //temp用来保存我们选择进行插入排序的元素的值
                //index用来保存要插入的角标位置
                int temp = arr01[i];
                int index = i;

                //将我们选择出来的元素与它左边的元素依次比较
                for (int j = i; j > 0; j--)
                {
                    //满足条件就先变更角标和后移比较过的元素的值
                    if (temp < arr01[j - 1]) 
                    {
                        arr01[j] = arr01[j - 1];
                        index = j-1;
                    }
                }

                //在合适的位置插入我们选择的值
                arr01[index] = temp;

            }

            //打印看看是否正确
            Console.WriteLine("排序后的数组为:");
            for (int i = 0; i < arr01.Length; i++)
            {
                Console.Write(arr01[i] + " ");
            }

好啦,上面这个就是优化版本了,可以看到我们省去了很多次交换的步骤,优化了代码。

插入排序算法就说到这里,有疑问的可以私聊博主。
点个关注,给个赞呗!
发布了25 篇原创文章 · 获赞 4 · 访问量 1732

猜你喜欢

转载自blog.csdn.net/maybe_ice/article/details/104355930