クイックソートアルゴリズムの原理とJava再帰実装

高洛峰
リリース: 2017-01-17 11:46:40
オリジナル
1448 人が閲覧しました

クイックソートはバブルソートを改良したものです。最初のレコードシーケンスがキーワードで順序付けされている場合、または基本的に順序付けされている場合、バブルソートに変質します。これは再帰的な原理を使用しており、同じ桁数 O(n longn) のすべての並べ替え方法の中で最高の平均パフォーマンスを備えています。平均時間の観点から、これは現在最良の内部並べ替え方法と考えられています

基本的な考え方は、一方向の並べ替えを通じて並べ替えるデータを 2 つの独立した部分に分割し、1 つの部分のすべてのデータの方がすべての部分のデータよりも優れているということです。他の部分のデータは小さい必要があるため、この方法を使用してデータの 2 つの部分をそれぞれすばやく並べ替えることができ、並べ替えプロセス全体を再帰的に実行できるため、データ全体が順序付けされたシーケンスになります。

3 つのポインター: 最初のポインターはピボットキー ポインター (ピボット) と呼ばれ、2 番目のポインターと 3 番目のポインターはそれぞれ左ポインターと右ポインターで、それぞれ左端の値と右端の値を指します。左ポインタと右ポインタは両側から同時に中央に近づきます。その際、常にピボットと比較され、ピボットより小さい要素は下端に移動し、ピボットより大きい要素は下端に移動します。ハイエンドは選択後は変わらず、前が小さく後ろが大きい中間になります。

2つの関数が必要です:

① 再帰関数 public static void QuickSort(int[]n ,int left,int right)
② Split 関数 (ワンパスクイックソート関数) public static int Partition(int[]n ,int左、int 右)

JAVA ソース コード (正常に実行):

package testSortAlgorithm;
public class QuickSort {
 public static void main(String[] args) {
  int [] array = {49,38,65,97,76,13,27};
  quickSort(array, 0, array.length - 1);
  for (int i = 0; i < array.length; i++) {
   System.out.println(array[i]);
  }
 }
 /*先按照数组为数据原型写出算法,再写出扩展性算法。数组{49,38,65,97,76,13,27}
  * */
 public static void quickSort(int[]n ,int left,int right){
  int pivot;
  if (left < right) {
   //pivot作为枢轴,较之小的元素在左,较之大的元素在右
   pivot = partition(n, left, right);
   //对左右数组递归调用快速排序,直到顺序完全正确
   quickSort(n, left, pivot - 1);
   quickSort(n, pivot + 1, right);
  }
 }

 public static int partition(int[]n ,int left,int right){
  int pivotkey = n[left];
  //枢轴选定后永远不变,最终在中间,前小后大
  while (left < right) {
   while (left < right && n[right] >= pivotkey) --right;
   //将比枢轴小的元素移到低端,此时right位相当于空,等待低位比pivotkey大的数补上
   n[left] = n[right];
   while (left < right && n[left] <= pivotkey) ++left;
   //将比枢轴大的元素移到高端,此时left位相当于空,等待高位比pivotkey小的数补上
   n[right] = n[left];
  }
  //当left == right,完成一趟快速排序,此时left位相当于空,等待pivotkey补上
  n[left] = pivotkey;
  return left;
 }
}
ログイン後にコピー

クイック ソート アルゴリズムの原則と Java 再帰的実装に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート