アルゴリズム:ソート概要:小さなハムの本

ahalei・2018年11月28日午前11時00分43秒に更新

ソート概要:小さなハムの本

一般的に使用される3つの古典的なソートの前に言えば。多くのソートアルゴリズムは、選択ソートは、ソート、基数ソート、挿入ソート、ヒープソートなどマージソートを数え、例えば、があります。ヒープソートは、バイナリツリー、後でそれについての話に基づいてソートされます。ソートアルゴリズムのクールなビデオを共有します。

のは、アプリケーションの3つのソートと制限の違いを見て、「小さなハムの本」の具体的な例を見てみましょう。ライブラリーコーナーを構築するために、学校の小さなハム、教師は生徒が本を読むのが好きかを確認するための研究を行うために、いくつかの学生を見つけるために、小さなハムを送りました。小まあは、各学生が彼らのほとんどが読みたい(あなたが知っている?各書籍は、固有のISBN番号を持っている、あなたは見に本のターンの裏に行って、信じていない)の書籍ISBN番号を記入してみましょう。もちろん、いくつかの良い本は多くの学生が重複ISBN番号の多くを集めることになる、のようなものがあるでしょうがあります。重複ISBN番号を削除する必要が小さなハム、つまり、各ISBN番号が、1つは、(学校が非常にけちである)同じ本を買うだけと言うことです。その後、小から大までこれらのISBN番号を入れて、小さなハム合わせは、本を買いに本屋にISBN番号をソート。小さなハム仕上げを助けてください「重い行く」と「並べ替え」の仕事。

picturez.1

行2は、入力、n個の調査(N <= 100)に参加する生徒を表す第1の正の整数の挙動です。第二行はスペースで区切られた正の整数値を有し、nは、各書籍のISBN番号(1〜1000 ISBN番号を仮定する)。

出力は正の整数kの最初の行為は、たくさんの本を購入する必要性を表明し、2行です。小規模から大規模まで二行k個のスペースで区切られた正の整数は、ISBN番号が良いシーケンスを購入する必要がブックに予定されています。たとえば、入力します。

102040326740208930040015

出力

8152032406789300400

最後に、プログラムの実行時間制限:1秒。

次いで、小から大へのソート出力、n個の重みにブックの最初のISBN番号:この問題に対する解決策は、基本的に第1の方法の2つです。第二の方法:まず、小規模から大規模まで、出力は重い行くこと。どちらの方法でも、することができます。

第一の方法は、最初に見えます。最初の研究を通して、私たちは、ほとんど変化のバケットソートがちょうど重量の効果を果たして行くことができたので、我々はこの問題を解決する方法のバケットソートを使用することができます。


    #include <stdio.h>
    int main()
    {
       int a[1001],n,i,t;
        for(i=1;i<=1000;i++)
             a[i]=0; //初始化

        scanf("%d",&n); //读入n
        for(i=1;i<=n;i++) //循环读入n个图书的ISBN号
        {
            scanf("%d",&t); //把每一个ISBN号读到变量t中
            a[t]=1; //标记出现过的ISBN号
        }

        for(i=1;i<=1000;i++) //依次判断1~1000这个1000个桶
        {
              if(a[i]==1)//如果这个ISBN号出现过则打印出来
                 printf("%d ",i);
        }

        getchar();getchar();
        return 0;
    }

この方法の時間複雑さは、その時の複雑さのバケツソートでO(N + M)です。

第二の方法は、我々は再発注を移動する必要があります。私たちは、並べ替えやクイックソート中古バブルソートすることができます。

20 40 32 67 40 20 89 300 400 15

1,520,203,240,406,789,300 400の多数の小これら10の後

次に、一度に重複した出力を削除します。我々はすでにソートしているので、同じ番号が一緒に近くなるようにします。限りの前の数と所定の数で出力電流の時と[I-1]と同じです。同じ番号はすでに再び異なる出力を介して出力する前にこのことを言っている場合。異なる、それはあなたが出力にこの数を必要とする、これは数が必要な最初の時間であると述べました。


    #include <stdio.h>
    int main()
    {
        int a[101],n,i,j,t;

        scanf("%d",&n);   //读入n
        for(i=1;i<=n;i++) //循环读入n个图书ISBN号
        {
            scanf("%d",&a[i]);
        }

       //开始冒泡排序
        for(i=1;i<=n-1;i++)
        {
             for(j=1;j<=n-i;j++)
            {
                 if(a[j]>a[j+1])
                {  t=a[j]; a[j]=a[j+1]; a[j+1]=t;  }
            }
        }
        printf("%d ",a[1]); //输出第1个数
        for(i=2;i<=n;i++) //从2循环到n
        {
             if( a[i] != a[i-1] ) //如果当前这个数是第一次出现则输出
                 printf("%d ",a[i]);
        }

        getchar();getchar();
        return 0;
    }

この方法の時間計算量は2つの部分から成り、(バブルソートの一部はO(のN2)、他方は読み取られ、出力はO(N)での時間の複雑さがあるので、アルゴリズムの時間複雑性はOであります2 のN + N2)。N2は、2相対的である(典型的には、我々は下位を無視)N無視できる、方法最終時間複雑性はO(N 2)です。

次に我々はまた、データ範囲を調べる必要があります。なお、n <= 100、100を超えない各書籍のISBN番号は1〜1000の整数であり、学生の数は、調査に参加しました。概算の時間複雑さは、我々は通常、コンピュータは、毎秒10億回の実行について考えるとき(もちろん、実際の状況の方が高速です)、と述べました。したがって、上記の二つの方法は、第二の溶液中で計算することができます。書籍のISBN番号の対象は、1〜1000の範囲ではありませんが、各ISBN番号をマークするような大規模な配列が表示されるためにあなたが適用できないため、-2147483648〜2147483647の間で、その後、第一の方法は、実行可能ではない場合あまりにも。Nの範囲が100に等しくない未満100,000以下、さらに場合、第2の方法のソーティング部は、バブルソートを使用することができません。対象の制限時間の要件は、ソート10万バブルソート番号を使用して、1秒であるため、コンピュータは、ソート、クイックソートが唯一の100000×log2100000≈100000×を必要とする迅速に交換する必要があり、100億回、10秒を実行する必要があります0.0017秒未満である17≈170万回、。これは魅力アルゴリズムで、異なるアルゴリズムを使用して、同じ問題が、実際にそのような大きな時間差を持って、素晴らしいではありません!

私たちは、この章ソートアルゴリズムの3種類の時間複雑で振り返ります。バケットソートその時間複雑度はO(N + M)であり、最速で、クイックソートはO(NlogN)であり、バブルソートはO(N 2)です。

月曜日のアルゴリズム[小]ハムの本
http://bbs.ahalei.com/thread-4443-1-1.html
(出典:ここからなるほどレイ_プログラムスタート)


http://wiki.jikexueyuan.com/project/easy-learn-algorithm/xiaohen-buy-book.html

おすすめ

転載: www.cnblogs.com/bqwzx/p/11029694.html