数据结构-排序之快速排序(使用Java代码实现)

Posted 没谱的曲

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构-排序之快速排序(使用Java代码实现)相关的知识,希望对你有一定的参考价值。

前言

最近在学习数据结构的排序算法时,学到了快速排序。对于快速排序的算法的具体实现过程有了一定了解,但在具体实现的时候出现了一些小问题。在和同学讨论和查阅资料过后打算使用java代码将其实现出来。

快速排序

快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

具体代码

排序部分

快速排序可以采用递归的方法实现

//快速排序
    //排序思想:选出一个基准数,把比哨兵大的数放到基准数的右边,比基准数小的数放到基准数左边,
    //     再使用同样的方法,对基准数前面部分和后面部分的数进行快速排序,最后获得一个有序的数组,
    //     整个排序过程可以看做一个递归的过程。
    public static void quickSort(int[] arr,int low , int high)
        // low,high 为每次处理数组时的首、尾元素索引

        // 当low==high是表示该序列只有一个元素,不必排序了
        if (low >= high) 
            return;
        
        // 选出哨兵元素和基准元素。这里左边的哨兵元素也是基准元素
        int i = low, j = high, base = arr[low];
        while (i < j) 
            // 右边哨兵从后向前找
            while (arr[j] >= base && i < j) 
                j--;
            
            // 左边哨兵从前向后找
            while (arr[i] <= base && i < j) 
                i++;
            
            swap(arr, i, j); // 交换元素
        
        swap(arr, low, j); // 基准元素与右哨兵交换

        // 递归调用,排序左子集合和右子集合
        quickSort(arr, low, j - 1);
        quickSort(arr, j + 1, high);

    

    private static void swap(int[] arr, int i, int j) 
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    

输入数组

java中不能直接通过手动输入整个数组,所以我写了一个方法,实现调用方法输入数组,并且可以控制输入的数组长度。

 public static int[] scanArray() 
        Scanner scanner = new Scanner(System.in);
        System.out.println("\\r请输入需要排序的数组的长度:");
        int length = scanner.nextInt();
        System.out.println("\\r请输入每一位需要排序的数值:");
        // 定义一个数组用于保存输入的数据
        int[] arr = new int[length];
        int digit = 1;
        int maxDigit = digit;
        for (int i = 0; i < arr.length; i++) 
            // 把数据按照从0开始的下标存入arr 数组
            arr[i] = scanner.nextInt();
        
        return arr;
    

实现排序

方法都封装完成后,我们就可以直接调用方法进行快速排序了,最后再输出排序后得到的数组

public static void main(String[] args) 
        int[] arr = scanArray();
        quickSort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    

运行结果:

总结

快速排序是排序算法中效率相对较高的,但使用的人却是比较少,大家一般信手拈来的排序算法就是冒泡排序。因为冒泡排序主观,容易理解,而快速排序使用到了递归,大家可能就有点不知所措了。
快速排序最优的情况下时间复杂度为:O( nlogn )
快速排序最差的情况下时间复杂度为:O( n^2 )
最优的情况下空间复杂度为:O(logn) ;每一次都平分数组的情况
最差的情况下空间复杂度为:O( n ) ;退化为冒泡排序的情况

以上是关于数据结构-排序之快速排序(使用Java代码实现)的主要内容,如果未能解决你的问题,请参考以下文章

数据结构-排序之快速排序(使用Java代码实现)

排序算法之快速排序(Java)

排序算法之快速排序(Java)

Java排序算法之快速排序

数据结构之排序算法Java实现—— 交换类排序之快速排序算法

Java集合与数据结构——七大排序算法的实现