C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++の別の配列で定義された順序に従って配列を並べ替えます


このセクションでは、別のソートの問題が発生します。 2つの配列A1とA2があるとします。要素間の相対的な順序がA2の場合と同じになるように、A1を並べ替える必要があります。一部の要素がA2に存在しない場合、それらはソートされた要素の後に追加されます。 A1とA2が次のようになっていると仮定します-

A1 = {2, 1, 2, 1, 7, 5, 9, 3, 8, 6, 8}
A2 = {2, 1, 8, 3}

ソート後、A1は以下のようになります-

A1 = {2, 2, 1, 1, 8, 8, 3, 5, 6, 7, 9}

この問題を解決するために、カスタム比較メソッドを作成します。このメソッドは、要素を比較して配列に配置します。比較ロジックは以下のようになります-

  • num1とnum2の両方がA2にある場合、A2のインデックスが低い数値は、他の数値よりも小さいものとして扱われます。
  • num1またはnum2のいずれかがA2に存在する場合、その数は、A2には存在しないもう一方よりも小さいものとして扱われます。
  • 両方がA2に存在しない場合は、自然順序付けが使用されます。

アルゴリズム

compare(num1, num2):
Begin
   if both num1 and num2 are present in A2, then
      return index of num1 – index of num2
   else if num1 is not in A2, then
      return -1
   else if num2 is not in A1, then
      return 1
   else
      num1 – num2
End

#include<iostream>
#include<algorithm>
using namespace std;
int size = 5;
int A2[5]; //global A2 will be used in compare function
int search_index(int key){
   int index = 0;
   for(int i = 0; i < size; i++){
      if(A2[i] == key)
      return i;
   }
   return -1;
}
int compare(const void *num1, const void *num2){
   int index1 = search_index(*(int*)num1);
   int index2 = search_index(*(int*)num2);
   if (index1 != -1 && index2 != -1)
   return index1 - index2;
   else if (index1 != -1)
      return -1;
   else if (index2 != -1)
      return 1;
   else
      return (*(int*)num1 - *(int*)num2);
}
main(){
   int data[] = {2, 1, 2, 1, 7, 5, 9, 3, 8, 6, 8};
   int n = sizeof(data)/sizeof(data[0]);
   int a2[] = {2, 1, 8, 3};
   int n2 = sizeof(a2)/sizeof(a2[0]);
   for(int i = 0; i<n2; i++){
      A2[i] = a2[i];
   }
   qsort(data, n, sizeof(int), compare);
   for(int i = 0; i<n; i++){
      cout << data[i] << " ";
   }
}

出力

2 2 1 1 8 8 3 5 6 7 9

  1. カウントソートを実装するC++プログラム

    カウントソートは安定したソート手法であり、少数のキーに従ってオブジェクトをソートするために使用されます。キー値が同じキーの数をカウントします。この並べ替え手法は、異なるキー間の差がそれほど大きくない場合に効率的です。そうでない場合は、スペースが複雑になる可能性があります。 ソート手法のカウントの複雑さ 時間計算量:O(n + r) スペースの複雑さ:O(n + r) 入力 −ソートされていないデータのリスト:2 5 6 2 3 10 3 6 7 8 出力 −並べ替え後の配列:2 2 3 3 5 6 6 7 8 10 アルゴリズム countingSort(array、

  2. シェーカーソートを実行するC++プログラム

    シェーカーソートは、指定されたデータをソートするために使用されます。シェーカーソートは、バブルソートとは異なり、配列を両方向に並べ替えます。このアルゴリズムの最悪の複雑さはO(n ^ 2)です。 アルゴリズム Begin    ShakerSort() function has ‘arr’ the array of data and ‘n’ the number of values, in the argument list.    // Implement Sorting algorithm using