並べ替えアルゴリズムの演習と挿入の並べ替え

はじめに

挿入ソートは、時間の複雑さがO(n 2)レベルのソートアルゴリズムです。では、なぜO(n 2時間の複雑さのアルゴリズムを学習する必要があるのでしょうか。場合によっては、挿入順の方が速い場合があります。たとえば、順序付けが近い配列の場合や、要素値の変動範囲が比較的小さい場合、挿入順の方が自然な利点があります。挿入ソートの考え方は、より高度なアルゴリズムにも適用でき、ソートをさらに最適化するのに役立ちます。

具体的なアイデア

  • インデックス値i設定して、2番目の要素の位置にインデックスを付けます
  • j = iになるように別のインデックス値jを設定します次に現在のjによってインデックスが付けられた要素を前の要素と比較し、スケジュールが必要な順序を満たさない場合は、順序をスケジュールする必要があるという要件が満たされるまで、要素を交換します。
  • 以下同様に、以下のすべての要素がトラバースされます。

コードの実装

以下では、C ++を使用して基本的な挿入ソートアルゴリズムを実装しています。

#include<bits/stdc++.h>
using namespace std;

template<class T>
void insertionSort(T arr[], int n) {
    //从第二个元素开始
    for(int i = 1; i < n; i++) {
        for(int j = i; j > 0; j--) {
            //依次与前一个元素比较
            if(arr[j-1] > arr[j]) 
                swap(arr[j-1], arr[j]);
        }
    }
    return;
}

int main(int argc, char const *argv[])
{
    // 测试
    int arr[10] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
    insertionSort(arr, 10);
    for(int i = 0; i < 10; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

最適化

多くの場合、コードを最適化する必要がありますが、上記のコードも最適化できます。これは私が書いた最適化された挿入ソートです。

#include<bits/stdc++.h>
using namespace std;

template<class T>
void insertionSortAd(T arr[], int n) {
    //从第二个元素开始
    for(int i = 1; i < n; i++) {
        //备份当前值
        T temp = arr[i];
        int j;
        for(j = i; j > 0 && arr[j-1] > temp; j--) {
            //当前面的元素不满足排序要求,覆盖到后面的位置,直到满足排序要求
            arr[j] = arr[j-1];
        }
        //此时 j 所在的位置就是temp该在的位置
        arr[j] = temp;
    }
    return;
}

int main(int argc, char const *argv[])
{
    // 测试
    int arr[10] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
    insertionSortAd(arr, 10);
    for(int i = 0; i < 10; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

頻繁な交換が時間に与える影響はなくなります。

最後

  • ブロガーのレベルが限られているため、不可避の欠落があり、読者は批評して修正することができます!
元の記事を5件公開しました Liked4 訪問数152

おすすめ

転載: blog.csdn.net/weixin_43587255/article/details/105505666