ホームページ  >  記事  >  php教程  >  バブル ソートとバブル ソートの 2 つの最適化

バブル ソートとバブル ソートの 2 つの最適化

高洛峰
高洛峰オリジナル
2016-12-19 13:39:571260ブラウズ

バブル ソート アルゴリズムは次のように機能します。2 つの隣接する要素を前から後ろに 1 つずつ比較します。2 番目の要素が最初の要素より小さい場合は、最後の要素と比較されるまで 2 つの要素を入れ替えます。最大の要素が最後に配置され、比較が (n-1) 回繰り返されて並べ替えが完了します。

------------------------------------------------ -------------------------------------------------- ----

クイックソート アルゴリズム (バブル ソートの最適化):

1) 2 つの変数 i と j を設定します。ソート開始時: i=0、j=N-1;

2) 最初の配列要素を使用します。キーデータとしてキーに割り当てます。つまり、key=A[0]

3) j から前方検索、つまり後ろから前方検索 (j--) し、最初の値を見つけます。 key より小さい A[j]、A[j] と A[i] を入れ替えます

4) i から後方検索、つまり前 (i++) から後方検索して、次の最初の A[i] を見つけます。が key より大きい場合、A[i] と A[j] を交換します

5) i=j になるまでステップ 3 と 4 を繰り返します (ステップ 3 と 4 では、一致する値が見つかりませんでした。つまり、A[ の場合) 3のj]がkey以上、4のA[i]がkey以下の場合、j=j-1、i=i+1となるようにjとiの値を一致するまで変更する条件の値が交換された場合、i と j のポインタの位置は変更されません。また、i==j の処理は i+ または j- が完了した時点で行われ、ループはここで終了します。時間)。

フラグ (符号) を設定します (各比較の後にバブル ソートのもう 1 つの最適化方法があります)。要素が交換されているかどうかを確認し、交換されている場合は次のサイクルを続行します。交換されていない場合は、サイクルを終了します。

この「フラグビットを設定する」方法は、「クイックソートアルゴリズム」ほど効率的ではありません。

------------------------------------------------ -------------------------------------------------- ----

C 言語コードは次のとおりです:

/*
** bubble sort
*/ 
void bubble_sort(int *str, int size)
{
     int i = 0, j = 0;
     int tmp = 0;
      
     /*
     ** 进行size-1趟排序;
     */
     for (i = 0; i < size - 1; i++)
     {
         /*
         ** 每排序一趟,将最大的元素沉底。下一趟少比较i次;
         */
 
          for (j = 0; j < size - 1 - i; j++)       
          {
               if (str[j] > str[j + 1])
               {
                    tmp = str[j];
                    str[j] = str[j + 1];
                    str[j + 1] = tmp;
               }
          }
 
     }
}
 
/*
** 优化一:设置一个标志位sign的bubble sort;
*/
 void bubble_sort(int *str, int size)
{
     int i = 0, j = 0;
     int tmp = 0, sign = 0;
      
     for (i = 0; i < size - 1; i++)
     {
          /*
          ** 每趟排序前将sign置为0,如果相邻元素进行了交换则sign>1;
          ** 否则,sign==0,没有进行交换,排序完成,跳出循环;
          */
          flag = 0;
          for (j = 0; j < size - 1 - i; j++)
          {
               if (str[j] > str[j + 1])
               {
                    tmp = str[j];
                    str[j] = str[j + 1];
                    str[j + 1] = tmp;
                    sign++;
               }
          }
          if (0 == sign)
          break;
     }
}
 
 
/*
** 优化二:quick sort;
*/
void quicksort(int *str, int left, int right)
{
     assert(str);
      
     /*
     **如果左边大于或等于右边,则该数组已经排序完成;
     */
     if (left >= right)
     {
          return;
     }
      
     int i = left;
     int j = right;
     int key = str[left];
      
     /*
     **当i=j时,一趟排序完成,将所有数分为一大一小两组;
     */
     while (i < j)
     {
          /*
          **第一次从后向前遍历,遇到第一个比key小的交换两数位置;
          */
          while ((i < j) && (key <= str[j]))
          {
               j--;
          }
          str[i] = str[j];
           
          /*
          **第二次从前向后遍历,遇到第一个比key大的交换两数位置;
          */
          while ((i < j) && (key >= str[i]))
          {
               i++;
          }
          str[j] = str[i];
     }
      
     str[i] = key;
     /*
     **递归调用,完成左、右子序列的排序;
     */
     quicksort(str, left, i - 1);
     quicksort(str, i + 1, right);
}

n が大きい場合、時間計算量 O(nlog2n) のソート方法を使用する必要があります: クイック ソート、ヒープ ソート、またはマージ ソート。

クイックソート: 現在、比較ベースの内部ソートの中で最良の方法と考えられています。ソート対象のキーワードがランダムに分散されている場合、クイックソートの平均時間が最も短くなります。バブル ソートとバブル ソートの 2 つの最適化に関する関連記事は、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。