• 插入排序


     最近在复习排序算法,发现排序算法真的博大精深!我乐此不疲的在追求算法,发现算法就在我身边!以下是大熊对排序算法的理解,无私的与大家分享了!

           先不讲理论,举个非常实际的例子!

           不知道看这篇文章的哥子会不会打牌?……不会打的话,那你还是不要学算法了,牌里面那么高深的博弈论就这样被你忽视了!开玩笑。……我们每起一张牌的时候,都会把这张牌插入适合他的位置,比如你手上有3,5,6 三张牌,现在起了一张4,很明显你会把他插到3和5之间。这个动作就是插入排序!恭喜你你已经学会了插入排序

    我们来做个实际的例子,先看一组散乱的数字,就像洗散了的牌:

    46 59 22 86 70 48 11 9 12 88

    我们假设,这10个数字是你之后将起到的10张牌,现在我们来模拟起牌。

    第一次你起到46,不做任何事;手上的牌 46

    第二次你起到59,跟46比较,比46大,直接放到46右边; 手上的牌  46 59

    第三次你起到22,跟59比较,比59小,继续跟46比较,比46小,放到46左边; 手上的牌  22 46 59

    第四次你起到86,跟59比较,比59大,直接放到59右边; 手上的牌  22 46 59 86

    ……

    最后我们能把这10 个数从小到大排好,现在再回头看他的规律!

    我们会发现,每次我们手上的牌总是有序的,恭喜你已经知道了插入排序的定义!

     

     

    掌握方法之后就要用计算机来实现了,这个过程叫做建模,或者抽象。我们先看一组计算机排序结果:

    红色数据指交换过位置的数。

    待排序的数据:  46 59 22 86 70 48 11 9 12 88

    第1趟排序结果:46 59 22 86 70 48 11 9 12 88  //59>46,顺序不变

    第2趟排序结果:22 46 59 86 70 48 11 9 12 88 //22<59,两个数交换,22<46,两个数再次交换,记住是每次出现<,都要交换。

    第3趟排序结果:22 46 59 86 70 48 11 9 12 88

    第4趟排序结果:22 46 59 70 86 48 11 9 12 88

    第5趟排序结果:22 46 48 59 70 86 11 9 12 88

    第6趟排序结果:11 22 46 48 59 70 86 9 12 88  //11<86,交换……11<22,交换

    第7趟排序结果:9 11 22 46 48 59 70 86 12 88

    第8趟排序结果:9 11 12 22 46 48 59 70 86 88

    第9趟排序结果:9 11 12 22 46 48 59 70 86 88

    最终排序结果:9 11 12 22 46 48 59 70 86 88

     

    理解原理后,我们来写算法!用C++实现。

     

    /*****楚河***************************************我是分界线帅哥*********下面文字来自大熊*********************/

     

    #include<iostream>

    using namespace std;

    //插入排序

    void insertSort(int a[999],int n)

    {

         int j = 1,i = 1;

         int key = 0,temp = 0;

         for(i = 1;i<n;i++)

         {

              key = a[i];

              for(j = i-1;j>=0;j–)

              {

                   if(key<a[j])

                   {

                        temp = a[j+1];

                        a[j+1] = a[j];

                        a[j] = temp;

                   }

                   else

                   {

                        a[j+1] = key;//当起到的牌Key大于他前面的那张牌,说明位置放好了,直接跳出

                        break;

                   }

              }

         }

    }

    int main()

    { 

         //test data:46 59 22 86 70 48 11 9 12 88

         int n = 0,i = 0;

         int a[999];

         cin>>n;//输入要排序数的长度

         for(i = 0;i<n;i++)

         {

              cin>>a[i];

         }

         insertSort(a,n);

         cout<<"最终排序结果:";

         for(i = 0;i<n;i++)

         {

              cout<<a[i]<<" ";

         }

         cout<<endl;

         return 0;

    }

  • 相关阅读:
    C#全角半角转换输出解决方法
    screen命令
    Parrot Linux国内源
    screen命令在freebsd安装和使用
    sysbench0.5 在 centos7下安装 (mysql-community-server)
    Mysql中文乱码问题完美解决方案
    PHP返回数据被nginx截断问题的解决方法
    yii2笔记:asset压缩js,css文件
    Yii2笔记:activerecord和activecontroller
    yii2笔记: 模块(module)
  • 原文地址:https://www.cnblogs.com/beipiaoboy/p/3325201.html
Copyright © 2020-2023  润新知