データ構造とアルゴリズムの基礎 (Wang Zhuo) (30): ソートの概要 (分類)、直接挿入ソートのアイデア

目次

並べ替えと分類:(この章の内容)

データ記憶媒体別:(学習コンテンツ)

内部ソート:

外部ソート:

コンパレータの数に応じて:(学習内容)

シリアルソート:

並列ソート:

主な操作によると: (学習コンテンツと内部の並べ替えは学習に焦点を当てます)

比較ソート:

基数ソート:

補助スペースによって:

その場で並べ替えます:

場違いに並べ替える:

安定性によって:

安定したソート:

 不安定なソート:

性質上:

挿入ソート

前提条件:

1. 直接挿入ソート

思考回路は次のとおりです。


並べ替えと分類:(この章の内容)


データ記憶媒体別:(学習コンテンツ)

内部ソート:

データ量が少なく、データはメモリ内にあり、内部メモリと外部メモリの間でデータを交換する必要はありません。

外部ソート:

大量のデータ、外部ストレージ内のデータ(ファイル整理)

外部メモリをソートする場合、ソートのためにデータをバッチでメモリにロードする必要があり、中間結果を時間内に外部メモリに格納する必要がありますが、これはより複雑です。

データがメモリに収まりません:

メモリの一部をソートし、ソート後のデータを外部メモリに入れる

外部ストレージから別の部分を取得し、(新しいラウンド) ソートを実行します


コンパレータの数に応じて:(学習内容)

シリアルソート:

シングルプロセッサ (一対の要素を同時に比較)

並列ソート:

マルチプロセッサ (複数の要素ペアを同時に比較)


主な操作によると: (学習コンテンツと内部の並べ替えは学習に焦点を当てます)

比較ソート:

挿入ソート、入れ替えソート、選択ソート、マージソート

基数ソート:

要素のサイズを比較せず、要素自体の値に従って順序付けされた位置のみを決定します。


補助スペースによって:

その場で並べ替えます:

補助領域の量は O(1) であり、ソートされるデータのサイズとは関係ありません。

場違いに並べ替える:

補助スペースの量が O(1) を超えています。これはソートされるデータのサイズに関連しています


安定性によって:

安定したソート:

任意の値を等しくできる要素。ソート後も相対的な順序は変わりません。

 不安定なソート:

等しい値を持つ要素は並べ替え後に相対的な順序で変更されます


性質上:

自然な並べ替え:

入力データの順序が多いほど、ソート速度が速くなります

不自然な順序:

入力データの順序が多いほど、ソート速度が遅くなります


挿入ソート


前提条件:

格納構造: シーケンシャルテーブルに格納

#include<iostream>
using namespace std;

#define MAXSIZE 20  //记录最大个数
typedef int KeyType;  //关键字类型

typedef int InfoType;

//定义每个记录(数据元素)的结构
struct RecType
    //Record Type:每条记录的类型
{
    KeyType key;  //关键字
    InfoType otherinfo;  //其他数据项
};

struct SqList 
    //顺序表(的)结构
{
    RecType r[MAXSIZE + 1]; 
    //类型为【记录类型】的数组
    //r[0]一般做哨兵或缓冲区
    int length;  //顺序表长度
};

int main()
{

}

1. 直接挿入ソート

PPTによると、整理すると、

思考回路は次のとおりです。

もちろん、ここでの「16」は実際には単なる仮想の指であり、7 と比較するために使用するすべての数字 (オブジェクト) を指します (表します)。 


PPT の 23 ページに示されている内容によれば、次のことが明らかです。

文字 i は以下を表すために使用されます: 各サイクル前の順序付きリスト (シーケンス テーブル) の末尾 (シーケンス末尾)

「挿入」のプロセス/操作全体を示す (完了する) には、文字 j を使用します。

次に、(再び)PPT の 27 番目のリマインダーと、以前の検索アルゴリズムに基づいて学んだ教訓に従って、次のようになります。

ここでは見張りを使う必要がある


最後に、プログラムの基本的な枠組みを次のように整理します。

補足: センチネルを追加

多くの要素を挿入する場合は、次
のように設定します。

ポインタ i は順次/順序付けされたシーケンスの末尾を指し、
ポインタ j は新しい要素を指します。

ノート:

当初設計されたアルゴリズムでは、センチネルを使用できる利便性が考慮されていませんでした。
現在は、新しく挿入された要素へのポインターを設定する必要はなくなり、新しく挿入された要素をセンチネルに置くだけです。

したがって、今、私たちは次のように確信しています。

  • 新しく挿入された要素をセンチネル (ビット順序 0 の位置) に配置します。
  •  j は、ソートされたシーケンス内で新しく挿入された要素と比較している要素 (の位置) を指します。
  • センチネル (ビット順序 0) 要素とポインター j が指す要素を比較します。
  1. 以上の場合: (センチネル要素がポインタ j が指す要素以上である)
    【要素の交換】

    j と j の後の順序付けされたシーケンスのすべての要素を 1 ビット後ろに移動します

    (挿入する新しい要素は既にセンチネルに配置されているため、1 ビット前に戻ったときにデータが失われるかどうかを心配する必要はありません)

    ポインタ j が指す位置にセンチネル要素を挿入します。

    注: (i++) を忘れないでください。
     

  2. 以下の場合: (センチネル要素はポインタ j が指す要素より小さい)
    [比較を続行、前の要素と比較]

    j--;

  3. i++

おすすめ

転載: blog.csdn.net/Zz_zzzzzzz__/article/details/130280707
おすすめ