快速排序算法(java实现)

快速排序算法是基于冒泡排序的,是对冒泡排序算法的一个改进。快速排序的效率比较高,是因为它的交换是跳跃式的。每次设置一个基准值,在比较的时候,将小于基准值的元素移到左边,将大于基准值的元素移到右边,这边一般不会只交换相邻的两个数。因此比较和交换的次数都会减少了,排序的效率自然也就高了。

快速排序的思想:

①在数组中找一个基准值,一般是取第一个数(纯粹为了方便);

②建立一个索引right,从数组的尾端开始遍历,直到找到一个比基准值小的数,记录此位置(j);

③建立一个索引left,从数组的首端开始遍历,直到找到一个比基准值大的数,记录此位置(i);

④当 i < j,则交换i和j两个位置上的值,并且继续在j-1位置开始往前遍历,在i+1位置开始往后遍历;

⑤当i == j,证明本次的比较已经结束,此时将i位置的值与基准值交换,基准值已经放在了最终的位置(此时基准值左边的元素都比基准值要小,基准值右边的元素都比基准值要大);

⑥在①~⑤的步骤中,基准值已经放在了正确的位置,我们可以对基准值左边的分区以及基准值右边的分区分别重复进行①~⑤的步骤,直到所有元素有序。

通过以上的步骤可以看出,快速排序算法其实是基于分治算法来实现的。不难写出实现代码:

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入数组大小:");
        int size = sc.nextInt();
        int[] arr = new int[size];
        System.out.println("请输入数组:");
        for(int i = 0; i < size; i++) {
            arr[i] = sc.nextInt();
        }
        quickSort(arr);
        for(int a : arr) {
            System.out.print(a + " ");
        }
    }
    
    public static void quickSort(int[] arr) {
        if(arr == null || arr.length <= 1)
            return;
        sort(arr, 0, arr.length-1);
    }
    
    public static void sort(int[] arr, int left, int right) {
        if(left > right)
            return;
        int baseVal = arr[left];
        int i = left, j = right;
        while(i != j) {
            while(arr[j] >= baseVal && j > i) {
                j--;
            }
            while(arr[i] <= baseVal && j > i) {
                i++;
            }
            if(i < j) {
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
        arr[left] = arr[i];
        arr[i] = baseVal;
        sort(arr, left, i-1);
        sort(arr, i+1, right);        
    }

}

 

posted on 2020-09-03 14:11  Jain_Shaw  阅读(275)  评论(0编辑  收藏  举报

导航