組み込みアルゴリズムソートアルゴリズム

組み込みアルゴリズムソートアルゴリズム

[[433624]]

1. バブルソート

バブル ソートは、C 言語のシンプルな初級レベルのソート アルゴリズムです。ソートする要素の列を繰り返し訪問し、隣接する 2 つの要素を順番に比較し、順序が間違っている場合はそれらを交換します。交換する必要がある隣接する要素がなくなるまで、つまり要素列がソートされるまで、チェックと比較を繰り返します。このアルゴリズムの名前の由来は、水の泡が最終的に上に浮かぶように、小さい (大きい) 要素が交換を通じてゆっくりとシーケンスの上部 (昇順または降順) に「浮かぶ」ため、「バブル ソート」という名前が付けられています。

アルゴリズムの説明

1. 隣接する要素を比較します。最初の値が2番目の値より大きい場合は、それらを交換します

2. 隣接する要素の各ペアに対して、最初のペアから最後のペアまで同じ操作を実行し、最後の要素が最大の数になるようにします。

3. 最後の要素を除くすべての要素に対して上記の手順を繰り返します。

4. ソートが完了するまで手順1~3を繰り返します。

ソースコード

  1. #include <stdio.h>
  2.  
  3. #ARRAY_SIZE 15 を定義します
  4.  
  5. void log( char *head, int *data, int len)
  6. {
  7. 符号なしchar i;
  8.  
  9. printf( "%s:" , ヘッド);
  10.  
  11. (i = 0; i < len; i++)の場合
  12. {
  13. printf( "%02d " , データ[i]);
  14. }
  15. printf( "\r\n" );
  16. }
  17.  
  18. // 小さい順から大きい順に並べ替える
  19. void bubble_sort( int *データ, int  サイズ
  20. {
  21. 整数i、j、 temp ;
  22.  
  23. (i = 0; i <サイズ; i++)の場合
  24. {
  25. (j = 0; j <サイズ-i-1; j++)の場合
  26. {
  27. if(data[j] > data[j + 1]) // 隣接する要素をペアで比較する
  28. {
  29. temp = data[j + 1]; // 要素の交換
  30. データ[j + 1] = データ[j];
  31. データ[j] = temp ;
  32. }
  33. }
  34. }
  35. }
  36.  
  37. intメイン(void)
  38. {
  39. intデータ[ARRAY_SIZE] = {3、44、38、5、47、15、36、26、27、2、46、4、19、50、48};
  40.  
  41. log( "ソース" 、データ、 ARRAY_SIZE);
  42. bubble_sort(データ、ARRAY_SIZE);
  43. log( "ソート" , データ, ARRAY_SIZE);
  44.  
  45. 0を返します
  46. }

運用結果

  1. 出典:03 44 38 05 47 15 36 26 27 02 46 04 19 50 48
  2. 並べ替え:02 03 04 05 15 19 26 27 36 38 44 46 47 48 50

2. 選択ソート

選択ソートは、シンプルで直感的なソート アルゴリズムです。まず、ソートされていないシーケンス内で最小 (最大) の要素を検索し、ソートされたシーケンスの先頭に格納します。次に、残りのソートされていない要素から最小 (最大) の要素を検索し続け、ソートされたシーケンスの末尾に配置します。すべての要素がソートされるまでこれを繰り返します。

アルゴリズムの説明

1. 初期状態では、すべてのデータは無秩序領域に属し、秩序領域は空である。

2. 順序付けされていない領域から最小の要素を選択し、順序付けされていない領域の最初の要素と交換します。

3. 順序なし領域が空になるまで、順序なし領域の次の要素から手順2を繰り返します。

ソースコード

  1. void 選択ソート( int *データ, int  サイズ
  2. {
  3. 整数i、j、 temp ;
  4. 整数 ;
  5.  
  6. (i = 0; i <サイズ- 1; i++)の場合
  7. {
  8. 最小値= i;
  9. (j = i + 1; j <サイズ; j++)の場合
  10. {
  11. if(data[j] < data[ min ]) // 最小の数値を見つける
  12. {
  13. min = j; // 最小値のインデックスを保存
  14. }
  15. }
  16.  
  17. if( min != i) // 対話が必要
  18. {
  19. temp = データ[i];
  20. データ[i] = データ[];
  21. データ[] =温度;
  22. }
  23. }
  24. }

前のアルゴリズムのbubble_sortの例はs​​election_sortに置き換えることができ、実行結果は同じです。

3. 挿入ソート

挿入ソート アルゴリズムは、順序付けられたシーケンスを構築することによって機能します。ソートされていないデータの場合、ソートされたシーケンス内で後ろから前へスキャンし、対応する位置を見つけて挿入します。

アルゴリズムの説明

1. 最初の要素から始めて、要素はソートされているとみなすことができます

2. 次の要素を取り出し、ソートされた要素の順序で後ろから前へスキャンします。

3. 要素(ソート済み)が新しい要素より大きい場合は、要素を次の位置に移動する

4. ソートされた要素が新しい要素以下になる位置が見つかるまで手順 3 を繰り返し、その位置に新しい要素を挿入します。

5. 手順2~4を繰り返します

ソースコード

  1. void 挿入ソート( int *データ, int  サイズ
  2. {
  3. int i、pre、 current ;
  4.  
  5. (i = 1; i <サイズ; i++)の場合
  6. {
  7. 前 = i - 1;
  8. 現在のデータ[i];
  9.  
  10. while(pre >= 0 && data[pre] > current ) //現在の要素を順序付けられた領域と1つずつ比較し、挿入します
  11. {
  12. データ[pre + 1] = データ[pre];
  13. --;  
  14. }
  15. データ[pre + 1] =現在のデータ;
  16. }
  17. }

4. 標準ライブラリ関数 qsort

前の 3 つのソート アルゴリズムは、単一の要素のみをソートします。ただし、実際のアプリケーションでは、MAC、名前、暗号化情報、信号強度などの WiFi 情報構造の配列など、大きな構造が特定の値に基づいてソートされます。WiFi 情報は、情報強度に従ってソートされます。各データ交換は、2 つのメモリ コピーを意味します。このシナリオでは、選択ソートの方がわずかに優れています。

車輪の再発明に比べると、C言語の標準ライブラリ関数の方が適切かもしれません。qsort関数はC言語に付属するソート関数で、真ん中。

関数プロトタイプ

  1. void qsort(void *base, size_t nitems, size_t size , int (*compar)(const void *, const void*))

base - ソートする配列の最初の要素へのポインタ

nitems - 配列内の要素数

size - 配列内の各要素のサイズ(バイト単位)

compar - この関数に基づいて 2 つの要素を比較します

戻り値: 値 値は返されません

デメリット: 複数の繰り返し値を持つ配列では効率が低く、不安定になる

  1. //qsortはcompareと組み合わせて使用​​する必要があります
  2. int比較(const void *値1、const void *値2)
  3. {
  4. //昇順または降順はここで調整されます
  5. (*( int *)値1 - *( int *)値2を返します。)
  6. }
  7.  
  8. intメイン(void)
  9. {
  10. intデータ[ARRAY_SIZE] = {3、44、38、5、47、15、36、26、27、2、46、4、19、50、48};
  11.  
  12. log( "ソース" 、データ、 ARRAY_SIZE);
  13. qsort(データ、ARRAY_SIZE、sizeof( int )、比較);
  14. log( "ソート" , データ, ARRAY_SIZE);
  15.  
  16. 0を返します
  17. }

その効果は前の 3 つのアルゴリズムと同じであり、特定の要素値に基づいて構造全体をソートするように拡張でき、信号強度によって Wi-Fi 情報をソートするという以前の要件を満たします。

  1. #include <stdio.h>
  2. #WIFI_AP_MAX 5 を定義します
  3.  
  4. typedef unsigned char uint8_t;
  5. typedef 符号付きchar int8_t;
  6. typedef unsigned short uint16_t;
  7. typedef 符号付き short int16_t;
  8. typedef 符号なしint uint32_t;
  9.  
  10. typedef構造体
  11. {
  12. uint32_t bssid_low; // MAC アドレスの下限
  13. uint16_t bssid_high; // MACアドレス高
  14. uint8_t チャネル; // チャネルID
  15. int8_t rssi; // 信号強度 <sort>
  16. }wifiApInfo_t;
  17.  
  18. //qsort は compare と組み合わせて使用​​し、信号強度 rssi の昇順で並べ替えます。
  19. int比較(const void *値1、const void *値2)
  20. {
  21. const wifiApInfo_t *ctx1 = (const wifiApInfo_t *)value1;
  22. const wifiApInfo_t *ctx2 = (const wifiApInfo_t *)value2;
  23. 戻り値(ctx1->rssi - ctx2->rssi);
  24. }
  25.  
  26. 静的wifiApInfo_t wifiApInfo[WIFI_AP_MAX] =
  27. {
  28. {0x5555, 0x55, 5, -55},
  29. {0x1111, 0x11, 1, -51},
  30. {0x3333, 0x33, 3, -53},
  31. {0x4444, 0x44, 4, -54},
  32. {0x2222, 0x22, 2, -52},
  33. };
  34.  
  35. void wifi_log( char *head, void *data, int  サイズ
  36. {
  37. 符号なしchar i;
  38. const wifiApInfo_t *wifi = (wifiApInfo_t *)データ;
  39.  
  40. printf( "%s:\r\n" , ヘッド);
  41.  
  42. (i = 0; i <サイズ; i++)の場合
  43. {
  44. printf( "%X %X %d [%d] \r\n" 、wifi[i].bssid_low、wifi[i].bssid_high、wifi[i].channel、wifi[i].rssi);
  45. }
  46. printf( "\r\n\r\n" );
  47. }
  48.  
  49. intメイン(void)
  50. {
  51. wifi_log( "ソース" 、 wifiApInfo、 WIFI_AP_MAX);
  52. qsort(wifiApInfo、WIFI_AP_MAX、sizeof(wifiApInfo_t)、比較);
  53. wifi_log( "ソート" 、 wifiApInfo、 WIFI_AP_MAX);
  54.  
  55. 0を返します
  56. }

運用結果

  1. ソース:
  2. 5555 55 5 [-55]
  3. 1111 11 1 [-51]
  4. 3333 33 3 [-53]
  5. 4444 44 4 [-54]
  6. 2222 22 2 [-52]
  7.  
  8. //信号強度キーワードに基づいて、WiFi情報の全体的なデータ同期がソートされます
  9. 選別:
  10. 5555 55 5 [-55]
  11. 4444 44 4 [-54]
  12. 3333 33 3 [-53]
  13. 2222 22 2 [-52]
  14. 1111 11 1 [-51]

5. まとめ

最適なソートアルゴリズムはありません。どの方法を使用するかは、ソートするデータのサイズと種類、および元のデータが大まかに順序付けられているかどうかによって決まります。ニーズに合わせて適切なアルゴリズムを選択できます。

<<:  新しい機械学習システムがロボットに社会的なスキルを与える

>>:  人工知能時代の教師の役割の再構築への道

ブログ    
ブログ    
ブログ    
ブログ    

推薦する

ゼロからヒーローへ、OpenAIが深層強化学習リソースをリリース

OpenAI は、誰でも深層強化学習に習熟できるように設計された教育リソース「Spinning Up...

...

アクセンチュア:AIが新しいUIとなり、7年後にはスクリーンレス時代が到来

編集者注: Amazon の Echo スマート スピーカーや自動運転車などのスクリーンレス ユーザ...

小さなモデル、大きなトレンド! Googleは2つのモデルを提案した。音量は7倍に減少し、速度は10倍に増加する。

[[426899]]ニューラル ネットワーク モデルとトレーニング データのサイズが大きくなるにつ...

...

老黄が勝利! Nvidia H100の注文は24年待ち、マスク氏も黙っていられない

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

ロボットがIoTアプリケーションの範囲を拡大する方法

ロボットの学習能力と IoT アプリケーションの相互接続性は、実りある未来を約束します。モノのインタ...

詩人のような機械学習: ML の仕組みについての素晴らしい啓示

機械学習はデータ内のパターンを使用して物事にラベルを付けます。魔法のように聞こえますが、核となる概念...

...

データサイエンスにおける ML+ と DL+ の時代へようこそ

企業のデジタル変革は、次々と熱狂の波をもたらしました。国際的な権威ある組織は、今後数年間の企業のデジ...

...

...

ベルギー国会議員は、携帯電話を使用しているとAIによって公に名指しされたため、議会で「気を散らされる」ことはできなくなった。

[[410932]]会議中にこっそりと携帯電話を見ている時間がバックグラウンド システムによって記...

データセンターにおけるロボットの使用はどのように増加するのでしょうか?

[[407824]]調査によると、ロボットがデータセンターに導入されつつありますが、データセンター...

ソフトウェアの欠陥予測のためのソフトウェア可視化と転移学習の活用

論文のデータセットとコードはオープンソース化されています: https://zenodo.org/r...