【算法】快速排序

注意点

  • 分治思想、递归思想
  • 时间复杂度O(nlogn),适合大规模数据排序
  • 在数组中 找一个分区点,把数据分隔成两区间,一部分小于分区点,一部分大于分区点,然后递归处理分隔后的连个小的区间。
  • 原地排序,不占用太多额外空间
package algorithm.sort;

import java.util.Arrays;

public class QuickSort {
    public static void main(String[] args) {
        int[] arr = {11,6,8,2,1,4,13};
        sort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }

    private static void sort(int[] arr,int head,int tail) {
        if(head > tail) return;

        int q = partition(arr,head, tail);

        sort(arr,head,q-1);
        sort(arr,q+1,tail);
    }

    /**
     * 分区,根据分区点,把数据分成两半
     * @param arr
     * @param head
     * @param tail
     * @return
     */
    private static int partition(int[] arr,int head,int tail){
        int pivot = arr[tail];//分区点
        int i = head;
        for(int j=head;j<=tail-1;j++) {
            if(arr[j] < pivot) {
                //swap arr[i] with arr[j]
                int tmp = arr[j];
                arr[j] = arr[i];
                arr[i] = tmp;
                i++;
            }
        }
        //swap arr[i] with arr[tail]
        arr[tail] = arr[i];
        arr[i] = pivot;
        return i;
    }

}
posted @ 2020-04-02 12:03  zendwang  阅读(104)  评论(0编辑  收藏  举报