クイックソートのJava基本アルゴリズム(Quick Sort)

1.アルゴリズムの紹介(再帰)

  1. 最初にカットオフ値(ここで真ん中の番号を使用してください)、次に配列を境界値で2つの部分に分割します。
  2. 左と右のポインターを使用してトラバースし、左のポインターはカットオフ値より大きいデータを指し、右のポインターはカットオフ値より小さいデータを指し、次に左と右のポインターがデータを交換します。交換後、左のポインターは前方に移動し、右のポインターは後方に移動します
  3. カットオフ値よりも小さいデータをカットオフ値の左側に配置し、カットオフ値よりも大きいデータをカットオフ値の右側に配置します。
  4. 次に、左側と右側のそれぞれでカットオフ値を取得し、カットオフ値よりも小さいデータをカットオフ値の左側に配置し、カットオフ値よりも大きいデータをカットオフ値の右側に配置します。

2.デモの例

元の配列:[117、101、106、100、112、60、90、110]

カットオフ値:100

左ポインタは以下を指します:117

右ポインターポイント:60

次に交換する

交換後:[90、101、106、100、112、60、117、110]

カットオフ値の左側がカットオフ値よりも小さく、カットオフ値の右側がカットオフ値よりも大きいことを確認して、実行を繰り返します。

実行結果:[90、60、100、106、112、101、117、110]

左のポインタは下付き文字を指します:3

右のポインタは下付き文字を指します:2

次に、上記のプロセスを[0、left pointer-1]配列で繰り返します。

次に、[右ポインタ+ 1、7]配列で上記のプロセスを繰り返します

詳細は図をご覧ください

3.図

クイックソート図

4.コードの実装

package sort;

import java.util.Arrays;

/**
 * <p>
 *
 * </p>
 *
 * @author: D
 * @since: 2020/9/10
 * @version: 1
 */
public class QuickSortDemo {
    
    
    public static void main(String[] args) {
    
    
        int[] arr = {
    
    117, 101, 106, 100, 112, 60, 90, 110};
        quickSort(arr, 0, arr.length - 1);
        System.out.println("排序后的结果: " + Arrays.toString(arr));
    }

    private static void quickSort(int[] arr, int left, int right) {
    
    
        System.out.println();
        System.out.printf("遍历的数组范围[%d, %d]", left, right);
        //左右下标
        int leftIndex = left;
        int rightIndex = right;
        int pivot = arr[(left + right) / 2];
        System.out.println();
        System.out.println("基准值 = " + pivot);
        int temp;
        //让比pivot小的放到左边,大的放到右边
        while (leftIndex < rightIndex) {
    
    
            //左边寻找大于等于pivot的值才推出
            while (arr[leftIndex] < pivot) {
    
    
                leftIndex++;
            }
            //右边边寻找小于等于pivot的值才推出
            while (arr[rightIndex] > pivot) {
    
    
                rightIndex--;
            }
            //如果成立 说明pivot左右两边的值已经是小于等于大于小于pivot的值
            if (leftIndex >= rightIndex) {
    
    
                break;
            }
            System.out.println("交换前结果: " + Arrays.toString(arr));
            System.out.println("当前左指针:" + leftIndex + ",指向的数据:" + arr[leftIndex]);
            System.out.println("当前右指针 = " + rightIndex+ ",指向的数据:" + arr[rightIndex]);
            // 左指针没有超过右指针 然后将左指针和右指针进行交换
            //交换
            temp = arr[leftIndex];
            arr[leftIndex] = arr[rightIndex];
            arr[rightIndex] = temp;

            //如果交换完后发现arr[leftIndex] == pivot的值 将右指针前移
            if (arr[leftIndex] == pivot) {
    
    
                System.out.println("交换完后发现arr[rightIndex] == pivot的值 将左指针后移");
                rightIndex--;
            }
            //如果交换完后发现arr[rightIndex] == pivot的值 将左指针后移
            if (arr[rightIndex] == pivot) {
    
    
                System.out.println("交换完后发现arr[rightIndex] == pivot的值 将左指针后移");
                leftIndex++;
            }

            System.out.println("交换的结果: " + Arrays.toString(arr));
            System.out.println("交换后左指针 = " + leftIndex);
            System.out.println("交换后右指针 = " + rightIndex);
        }
        System.out.println("之后的左右指针");

        //左右指针相同 将右指针前移 左指针后移
        if (leftIndex == rightIndex) {
    
    
            System.out.println("左右指针相同 将右指针前移 左指针后移");
            leftIndex++;
            rightIndex--;
        }
        System.out.println("leftIndex:" + leftIndex);
        System.out.println("rightIndex:" + rightIndex);
        System.out.println("left: " + left);
        System.out.println("right: " + right);

        // 两个条件都不满足则排序完成
        if (left < rightIndex) {
    
    
            quickSort(arr, left, rightIndex);
        }
        if (leftIndex < right) {
    
    
            quickSort(arr, leftIndex, right);
        }
    }
}

5.実行結果

画像-20200911002655374

image-20200911002706490

image-20200911002717204

image-20200911002726689

6.その他の並べ替え

選択ソート(選択ソート)
挿入ソート(挿入ソート)
ヒルソート(シェルソート)
バブルソート(バブルソート)
ヒープソート(ヒープソート)

おすすめ

転載: blog.csdn.net/d875708765/article/details/108525947