zoukankan      html  css  js  c++  java
  • 插入排序

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

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

           不知道看这篇文章的哥子会不会打牌?……不会打的话,那你还是不要学算法了,牌里面那么高深的博弈论就这样被你忽视了!开玩笑。……我们每起一张牌的时候,都会把这张牌插入适合他的位置,比如你手上有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;

    }

  • 相关阅读:
    SQL学习
    FOR XML PATH
    IOS学习网址
    weak nonatomic strong等介绍(ios)
    UVALive3045 POJ2000 ZOJ2345 Gold Coins
    UVA713 UVALive5539 POJ1504 ZOJ2001 Adding Reversed Numbers
    UVA713 UVALive5539 POJ1504 ZOJ2001 Adding Reversed Numbers
    UVA439 POJ2243 HDU1372 ZOJ1091 Knight Moves【BFS】
    UVA439 POJ2243 HDU1372 ZOJ1091 Knight Moves【BFS】
    UVA10905 Children's Game
  • 原文地址:https://www.cnblogs.com/beipiaoboy/p/3325201.html
Copyright © 2011-2022 走看看