バブル ソート アルゴリズムは次のように機能します。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 サイトに注目してください。