双指针快速排序

思想

同样去一个数位基准数进行递归分区,两个指针分别从头和尾开始遍历数据,如果头不大于基准数,尾不小于基准数则不改位置,否则尾数与头交换。

实现思路

两个循环,循环执行条件第一个是尾数不小于基准数,且尾下标大于头下标,第二个相反,如果结束则交换数。外层一个循环执行条件为头不大于尾。

实现代码

package sort;

import java.util.Random;

public class TPQuickSort {
    /**
     * 双指针快速排序;通过头指针与尾指针同时前进,找到比分界值@pivot大或者小的值进行交换;
     * 千万级随机数耗时1608毫秒
     * @param arr
     * @param pivot
     */
    public static void quickSort(int[] arr) {
        quickSort(arr, 0, arr.length - 1);
    }

    private static void quickSort(int[] arr, int begin, int end) {
        if (begin < end) {
            int pos = partition(arr, begin, end);
            quickSort(arr, begin, pos - 1);
            quickSort(arr, pos + 1, end);
        }
    }

    private static int partition(int[] arr, int begin, int end) {
        int pivot = arr[begin];
        while (begin < end) {
            /*
             * 从后往前遍历,找到比pivot小的值
             */
            while (begin < end && arr[end] >= pivot) {
                end--;
            }
            arr[begin] = arr[end];
            /*
             * 从前往后遍历,找到比pivot大的值;
             */
            while (begin < end && arr[begin] <= pivot) {
                begin++;
            }
            arr[end] = arr[begin];
        }
        arr[begin] = pivot;
        return begin;
    }

    public static void main(String[] args) {
//        int[] arr = { 8, 5, 6, 7, 2, 3 };
      int[] arr = new int[10000000];
      for(int i = 0; i < arr.length; i++){
          arr[i] = new Random().nextInt(10000000);
          }
        long startTime = System.currentTimeMillis();
        TPQuickSort.quickSort(arr);
        long endTime = System.currentTimeMillis();
        System.out.println("时间" + ":" + (endTime - startTime));

//        for ( int i : arr ) {
//            System.out.println(i);
//        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_34332035/article/details/78461863