基础排序(二)·快速排序

这篇博客详细介绍了快速排序的思想原理,通过一趟排序将待排序序列分为两部分,基准元素左侧元素小于基准,右侧元素大于基准。然后递归地对左右子序列进行相同排序,直至所有元素有序。文中给出了具体的实现思路和代码示例,展示了快速排序的过程,并解答了可能存在的疑问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思想原理: 通过一趟排序,将以某个元素为基准分为左右两个子序列,左序列所 有元素都小于基准元素,右序列所有元素大于基准元素。然后再分别对左右序列进行同样的排序方法,以此递归下去得到结果。

实现思路: 基准元素是每次在排序前自己规定好的,那么我就自己规定每次给未排序序列的第一个元素为基准,其他元素与基准进行比较,比基准大的放左边,反之右边,以此递归下去。

举例:假设基准为未排序序列的第一个元素

int[] array = {12, 23, 6, 56, 32, 2, 5, 10, 47, 9};
.

array1223656322510479

以array[0]为基准,经过一趟排序后:
.

array9106521232564723

由上可知,以红色元素为基准的最初序列变成两部分,采用递归的方法对子序列进行相同方式的排序。
.
疑问解释:可能大家觉得一趟排序完后,元素的顺序什么是这样的,兄弟莫慌, 往下看我写的实现代码,如若不懂请留言,后续补上!

代码:

public class QuickSortTest {


    public static void main(String[] args) {
        int[] array = {12,  23,  6,  56,  32,  2,  5,  10,  47,  9};
        System.out.println("初始顺序:"+Arrays.toString(array));
        quickSort(array, 0, array.length-1);
        System.out.println("结果:"+Arrays.toString(array));

    }

    static void quickSort(int[] array, int low, int high){
        if (low < high) {
            //得到排序后基准元素位置
            int mid = getMiddle(array, low, high);
            System.out.println("在序列范围["+low+","+high+"]排序后:基准位置是:"+mid+","+Arrays.toString(array));
            quickSort(array, low, mid-1);
            quickSort(array, mid+1, high);
        }
    }

    private static int getMiddle(int[] array, int low, int high) {
        int temp = array[low];
        while(low < high){
    //array[high] >= temp, 切记是>=, 不然会死循环
            while(low < high && array[high] >= temp)
                high--;
            array[low] = array[high];
            while(low < high && array[low] <= temp)
                low++;
            array[high] = array[low];
        }
            array[low] = temp;
        return low; 
    }

}

打印结果:

初始顺序:[12, 23, 6, 56, 32, 2, 5, 10, 47, 9]
在序列范围[0,9]排序后:基准位置是:5,[9, 10, 6, 5, 2, 12, 32, 56, 47, 23]
在序列范围[0,4]排序后:基准位置是:3,[2, 5, 6, 9, 10, 12, 32, 56, 47, 23]
在序列范围[0,2]排序后:基准位置是:0,[2, 5, 6, 9, 10, 12, 32, 56, 47, 23]
在序列范围[1,2]排序后:基准位置是:1,[2, 5, 6, 9, 10, 12, 32, 56, 47, 23]
在序列范围[6,9]排序后:基准位置是:7,[2, 5, 6, 9, 10, 12, 23, 32, 47, 56]
在序列范围[8,9]排序后:基准位置是:8,[2, 5, 6, 9, 10, 12, 23, 32, 47, 56]
结果:[2, 5, 6, 9, 10, 12, 23, 32, 47, 56]

LZ本着能少pilibala就少pilibala的原则做事,如果不懂,请留言。 相互学习交流~^_^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值