[データ構造]基本:6つのソートアルゴリズム(単純挿入ソート、ヒルソート、バブルソート、クイックソート、単純選択ソート、ヒープソート)

I.はじめに

データ構造には、リンクリスト(スタックとキューを含む)、バイナリツリー、グラフ、検索、および
並べ替えの5つのテストポイントのみがあります。3つの並べ替えテストポイント:すべての並べ替えアルゴリズムの比較+各並べ替えアルゴリズムの原則+各並べ替えアルゴリズムの特性

2つの簡単な挿入ソート

2.1デモ+実行結果

#include <iostream>

using namespace std;
void InsertSort(int r[],int n)   //0号单元为暂存单元和监视哨    
{
    
    
    int j=0;
    for(int i=2; i<=n; i++)
    {
    
    
        r[0]=r[i];                     //用于暂存待排序元素  
        for ( j=i-1; r[0]<r[j]; j--)    //寻找合适的插入位置
            r[j+1]=r[j];                  //移动
        r[j+1]=r[0];
    }

}
int main()
{
    
    
    int a[5];
    for (int i=0; i<5; i++)
        cin>>a[i];
    cout<<endl;
    InsertSort(a,5);
    for (int i=1; i<5; i++)
    {
    
    
        cout<<a[i];
        cout<<" ";
    }
    cout<<endl;
    return 0;
}

動作結果:

​​​​ここに写真の説明を挿入

2.2特徴:簡単な挿入ソート

単純な挿入の並べ替え:
1。ループが2つあるため、時間の複雑さはO(n ^ 2)です
。2。空間の複雑さはO(1)で、一時的な番兵が1つです。3。
隣接する動きだけで、ジッターはありません。安定したソート;
4。シーケンスが基本的に順序付けられている状況に適しています。

三、ヒルソート

概要:高度な並べ替え方法であるヒル並べ替えは、単純な挿入並べ替えのアップグレードバージョンと見なすことができます。

3.1デモ+実行結果

#include <iostream>
 
using namespace std;
void shellSort(int r[],int n)
{
    
    
    for (int d=n/2; d>=1; d=d/2)
    {
    
    
 
        for (int i=d+1; i<=n; i++) //d为增量
        {
    
    
 
            r[0]=r[i];    //0号元素用于暂存  没有意义
            int j=0;
            for ( j=i-d; j>0&&r[0]<r[j]; j=j-d)
                r[j+d]=r[j];           //记录每次移动d个位置,跳跃移动
            r[j+d]=r[0];
        }
    }
}
int main()
{
    
    
    int a[6];
    for (int i=0; i<6; i++)
        cin>>a[i];
    cout<<endl;
    shellSort(a,6);
    for (int i=1; i<6; i++)
    {
    
    
        cout<<a[i];
        cout<<" ";
    }
 
    cout<<endl;
    return 0;
}

動作結果:

ここに写真の説明を挿入

3.2機能:ヒルソート

ヒルソーティング:
1。時間の複雑さはO(nlgn)〜O(n ^ 2)であり、これは多数の繰り返し実験の結果です
。2。空間の複雑さはO(1)、一時的な番兵です。3。
ジッターがあります。動きは不安定な種類です。

第四に、バブルソート

概要:バブルソート、低レベルソート、わかりやすい

4.1デモ+実行結果

#include <iostream>
 
using namespace std;
void bubbleSort(int r[],int n)
{
    
    
    int exchange=n;
    while(exchange!=0)
    {
    
    
 
        int  bound=exchange;
        exchange=0;
        for (int j=1; j<bound; j++)
        {
    
    
            if(r[j]>r[j+1])
            {
    
    
                r[0]=r[j];         //0号元素用于交换暂存
                r[j]=r[j+1];
                r[j+1]=r[0];
                exchange=j;
            }
        }
    }
}
int main()
{
    
    
    int a[6];
    for (int i=0; i<6; i++)
        cin>>a[i];
    cout<<endl;
    bubbleSort(a,6);
    for (int i=1; i<6; i++)
    {
    
    
        cout<<a[i];
        cout<<" ";
    }
 
    cout<<endl;
    return 0;
}

動作結果:

ここに写真の説明を挿入

4.2機能:バブルソート

バブルの並べ替え:
1。ループが2つあるため、時間の複雑さはO(n ^ 2)です
。2。空間の複雑さはO(1)で、一時的な番兵が1つです。3。
隣接する動きのみがあり、ジッターはありません。安定したソート。

5、クイックソート(インタビューフォーカス)

概要:高度な並べ替えであるクイック並べ替えは、バブル並べ替えのアップグレードバージョンと見なすことができます

5.1デモ+実行結果

#include <iostream>
 
using namespace std;
int Partition(int r[],int first,int _end)
{
    
    
 
    int i=first;int j=_end;
    while(i<j)
    {
    
    
 
        while(i<j && r[i]<=r[j])  j--;
        if(i<j)
        {
    
    
 
            int temp=r[i];
            r[i]=r[j];
            r[j]=temp;
            i++;
        }
        while(i<j && r[i]<=r[j]) i++;
        if(i<j)
        {
    
    
 
            int temp=r[i];
            r[i]=r[j];
            r[j]=temp;
            j--;
        }
    }
    return i;
}
void QuickSort(int r[],int first,int _end)
{
    
    
    if(first<_end)
    {
    
    
        int pivot=Partition(r,first,_end);
        QuickSort(r,first,pivot-1);
        QuickSort(r,pivot+1,_end);
    }
}
int main()
{
    
    
    int a[6];
    for (int i=0; i<6; i++)
        cin>>a[i];
    cout<<endl;
    QuickSort(a,0,5);
    for (int i=0; i<6; i++)
    {
    
    
        cout<<a[i];
        cout<<" ";
    }
 
    cout<<endl;
    return 0;
}

動作結果:

ここに写真の説明を挿入

5.2機能:クイックソート

クイックソート:
1。時間の複雑さはO(nlgn);
2.空間の複雑さは交換変数であるO(1)です(交換中に加算と減算を適切に使用する場合はこの変数を省略できます);
3。そうではないジッタがあります安定したランキング;

6つの単純な選択ソート

要約:単純な選択ソート、低レベルのソート方法、理解しやすい

6.1デモ+実行結果

#include <iostream>
 
using namespace std;
void selectSort(int r[],int n)
{
    
    
    for (int i=1; i<n; i++)
    {
    
    
 
        int index=i;
        int j=0;
        for (j=i+1; j<=n; j++)
        {
    
    
            if(r[j]<r[index])
            {
    
    
                r[0]=r[j];           //0号元素用于暂存玩车个交换
                //  其实可以不用这样,使用加减法可以不需要暂存元素,这里方便读者理解,用简单的方式
                r[j]=r[index];
                r[index]=r[0];
            }
        }
        if(index!=i)
        {
    
    
 
            r[0]=r[i];
            r[i]=r[index];
            r[index]=r[0];
        }
    }
}
int main()
{
    
    
    int a[6];
    for (int i=0; i<6; i++)
        cin>>a[i];
    cout<<endl;
    selectSort(a,6);
    for (int i=1; i<6; i++)
    {
    
    
        cout<<a[i];
        cout<<" ";
    }
 
    cout<<endl;
    return 0;
}

動作結果:

ここに写真の説明を挿入

6.2機能:簡単な選択と並べ替え

単純な選択の並べ替え:
1。ループが2つあるため、時間の複雑さはO(n ^ 2)です
。2。空間の複雑さはO(1)であり、交換を実現するために一時的な要素が使用されます(必須ではありません。2つの数値を追加できます)。減算は2つの数値の交換を実現します);
3。不安定なソートである要素バウンスがあります;
4。最良および最悪の平均時間の複雑さはO(n ^ 2)であるため、アプリケーションの優先順位はありません

セブン、ヒープソート

概要:高度な並べ替え方法であるヒープ並べ替えは、単純な選択並べ替えのアップグレードバージョンと見なすことができます。

7.1デモ+実行結果

#include <iostream>
 
using namespace std;
void shift(int r[],int k,int m)
{
    
    
 
    int  i=k,j=2*i;   // i 为某个结点  2*i为该结点的左孩子
    while(j<=m)         //  其左孩子没到结束  说明该结点还是非叶子结点,因为叶子结点是没有左孩子的
    {
    
    
 
        if(j<m && r[j]<r[j+1]  )  j++;  //j和j+1  比较左右孩子,j指向较大者
        if(r[i]>r[j])  break;    //当根结点大于左右孩子中较大者,跳出本次循环
        else                //否则,交换根节点和左右孩子较大者
        {
    
    
            r[0]=r[j];   //0号元素用于交换暂存
            r[j]=r[i];
            r[i]=r[0];
            i=j;
            j=2*i;
        }
    }
}
 
void heapSort(int r[],int n)
{
    
    
    for (int i=n/2; i>=1; i--)
        shift(r,i,n);
    for (int i=1; i<n; i++)
    {
    
    
        r[0]=r[1];    //0号元素用于交换暂存
        r[1]=r[n-i+1];
        r[n-i+1]=r[0];
        shift(r,1,n-i);
    }
}
int main()
{
    
    
    int a[6];
    for (int i=0; i<6; i++)
        cin>>a[i];
    cout<<endl;
    heapSort(a,6);
    for (int i=1; i<6; i++)
    {
    
    
        cout<<a[i];
        cout<<" ";
    }
 
    cout<<endl;
    return 0;
}

動作結果:

ここに写真の説明を挿入

7.2機能:ヒープソート

ヒープソーティング:
1。2サイクルのため、時間の複雑さはO(nlgn)です
。2。スペースの複雑さはO(1)であり、一時的な番兵です。3
不安定なソートであるジッターがあります
。4。最初の最小の要素と最初の最大の要素の選択に適しています

8.インタビューチートシート(ソートアルゴリズムの原理+ソートアルゴリズムの特徴)

データ構造には、リンクリスト(スタックとキューを含む)、バイナリツリー、グラフ、検索、および
並べ替えの5つのテストポイントのみがあります。3つの並べ替えテストポイント:すべての並べ替えアルゴリズムの比較+各並べ替えアルゴリズムの原則+各並べ替えアルゴリズムの特性

各ソートアルゴリズムの特性を最初にリストし、ソートアルゴリズムの原理については後で説明します。

単純な挿入の並べ替え:
1。ループが2つあるため、時間の複雑さはO(n ^ 2)です
。2。空間の複雑さはO(1)で、一時的な番兵が1つです。3。
隣接する動きだけで、ジッターはありません。安定したソート;
4。シーケンスが基本的に順序付けられている状況に適しています。ヒルソート

1。時間の複雑さはO(nlgn)〜O(n ^ 2)であり、これは多数の繰り返し実験の結果です
。2。空間の複雑さはO(1)、一時的な番兵です。3。
ジッターがあります。動きは不安定な種類です。

バブルソーティング:
1。ループが2つあるため、時間の複雑さはO(n ^ 2)です
。2。空間の複雑さはO(1)で、一時的な番兵が1つです。3。
隣接する動きのみがあり、ジッターはありません。安定したソート。
クイックソート:
1。時間の複雑さはO(nlgn);
2.空間の複雑さは交換変数であるO(1)です(交換中に加算と減算を適切に使用する場合はこの変数を省略できます);
3。そうではないジッタがあります安定したランキング;

単純な選択の並べ替え:
1。ループが2つあるため、時間の複雑さはO(n ^ 2)です
。2。空間の複雑さはO(1)であり、交換を実現するために一時的な要素が使用されます(必須ではありません。2つの数値を追加できます)。減算は2つの数値の交換を実現します);
3。不安定なソートである要素バウンスがあります;
4。最良および最悪の平均時間の複雑さはO(n ^ 2)
ヒープソートであるため、アプリケーションの優先順位はありません
1 、2サイクルのため、時間の複雑さはO(nlgn)です
。2。空間の複雑さはO(1)であり、一時的な番兵です。3
。不安定なソートであるジッタがあります
。4。選択に適しています。最小の最初のいくつかの要素と最大の最初のいくつかの要素

ナイン、まとめ

6つのソートアルゴリズム(単純挿入ソート、ヒルソート、バブルソート、クイックソート、単純選択ソート、ヒープソート)が完了します。

毎日コーディングし、毎日進歩してください!

おすすめ

転載: blog.csdn.net/qq_36963950/article/details/108953996