ソートアルゴリズム - 概要

何か間違ってはありますが、私を修正してください

バブルソート

核となるアイデア

数Nは、後方から前方へ、昇順に配置されている場合昇順大で後者よりも前者の場合は、(私はそれがよりよく理解されると思う)は、隣接する対毎の比較のサイズ直ちに入れタリア転置、直接交換位置、ダウン最初のパスの最大最後の1で、比較せずに最後の後、二回目、第二位で2番目に大きいです。N-1回の最初のパスの比較は、不確実回交換、N-2回の第二時間を比較します。

void bubble_sort(int a[],int n)
{
    int tem=0;
    for(int i=n-1;i>0;--i)
    {
        for(int j=0;j<i;++j)
        {
            if(a[j]>a[j+1])
            {
                tem=a[j];
                a[j]=a[j+1];
                a[j+1]=tem;
            }

        }
    }
}

選択ソート

核となるアイデア

  1. 具体的な方法は以下のとおりです。

    最も大切な要素の位置の記録を横断する、トラバースの端部は、この要素の値は、の最適な位置に調整される
    N-1、唯一の交換、それはほとんどの値の適切な配置であろう時間を比較し、最初のパス


void sort(int a[],int n){
      for(int i=0;i<n;i++)//外层循环
        {
        int min=a[i];//每次循环把a[i]假设当前最小的数
        int index=i;//相当一个索引,始终指向最小的
        for(int j=i+1;j<n;j++)//内层循环,从剩下的数中找有没有更小的
        {
            if(a[j]<min)
            {
                min=a[j];
                index=j;//跟新索引
            }
        }
          int temp=a[index];//交换
          a[index]=a[i];
          a[i]=temp;
      }
  }

改进
void select_sort(int a[],int n)
{
    int k,temp;
    for(int i=0;i<n-1;i++)
    {
        k=i;//假设最小为a[i],用k标记
        for(int j=i+1;j<n;j++)//内层循环,从剩下的数中找有没有更小的
        {
            if(a[j]<a[k])
            {
              k=j;//找到新的最小的,跟新k的值
            }
        }
        if(i!=k)//比较i和k的值,判断是否交换
        {
            temp=a[i];
            a[i]=a[k];
            a[k]=temp;
        }
    }

}



ケース場合、同じデータは、2つのアルゴリズムのサイクル数は、比較の同じ数が、選択ソートのみ0~1回交換、及びバブルソート交換のみ0回nと同じです。
アルゴリズムの主要部分は、私たちのパフォーマンスは循環と交換で影響を与え、明らかに、より多くの数、さらに悪いパフォーマンス。それはOの複雑さ(N * N)です。しかし、別の効率
ソートバブル:
逆の場合のデータ交換などの同じサイクル数(交換が各サイクルで決定される)、
Oの複雑さ(N * N)。データが正のときは、何のやり取りはありません。複雑さはO(0)です。中間状態の乱れ。これは、このような理由のために、我々はサイクルの数を比較するために、通常のアルゴリズムですです。
選択ソート:
各外側ループは一つだけ交換(最低限)を生成するため。したがって、F(N)<= N
我々はF(N)= O(Nを有します )。だから、データ内のより多くの混乱が、それは回数一定の交換を減らすことができます。

クイックソート

核となるアイデア:

挿入ソート

核となるアイデア:
すべてのきっかけになるまですべてのステップは、それらの位置に応じて適切な大きさに挿入されるデータの行が既にデータをソートすること挿入ソート。
1、[0]がソートされていると考えることができることは最初の要素から始まります。
図2に示すように、背面から走査で順序付けされた要素のシーケンスの次の要素を取得
、3なら要素a [0](ソート)、新しい要素[1]、その後、要素[0]はシフトよりも大きいです次の位置に
4、場所を見つけるまで繰り返す3未満、または新規要素の要素順序付け等しい
5を、新たな要素が位置に挿入されている
6を繰り返した2

直接バイナリ挿入にソートし、除算に挿入ソート方法ソートここ2、ある唯一の直接挿入ソート、バイナリ挿入ソート別の記事を参照してくださいhttp://blog.csdn.net/qq_29232943/article/details/52939374
1つのプレゼンテーションチャート直接ソートへのプロセスの四つの要素、(A)の合計、(B)、 (C) キュービック補間。書き込み絵は、ここで説明しました

#include <iostream>

using namespace std;
void insert_sort(int a[],int n);
int main()
{
    int a[]={3,41,369,1,2,4,5,9};
    int n=8;
    insert_sort(a,n);
    for(int i=0;i<n;i++)
    {
        cout<<a[i]<<" ";
    }
    return 0;
}
void insert_sort(int a[],int n)
{
    for (int i=1;i<n;i++)
    {
        for(int j=i;(j>0)&&(a[j]<a[j-1]);j--)
        {
            int tem=a[j];
            a[j]=a[j-1];
            a[j-1]=tem;
        }
    }
}

最良の場合、既に上昇、唯一のn-1の比較、最悪の場合は、nに、降順(N-1)/比較
Oの平均複雑度(N 2)

シェルソート

公開された175元の記事 ウォン称賛76 ビュー23万+

おすすめ

転載: blog.csdn.net/qq_29232943/article/details/52782920