分治法之排序技术--快速排序

本文深入解析了分治算法的基本思想,介绍了如何将一个大问题分解为若干个小问题,并通过解决小问题来解决原问题的方法。特别聚焦于查找技术和排序技术,详细阐述了二分查找、快速排序和归并排序等经典算法的原理与步骤。

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

分治算法

分治法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。即一种分目标完成程序算法,简单问题可用二分法完成。


分治法的精髓

分--将问题分解为规模更小的子问题;

治--将这些规模更小的子问题逐个击破;

合--将已解决的子问题合并,最终得出“母”问题的解。


应用

分治法具体应用有查找技术还有排序技术。查找技术有二分查找;排序有快速排序还有归并排序等。

   排序:

         快速排序、归并排序。

   快速排序:

快速排序应该场景:数据量大并且是线性结构。

短处:有大量重复数据的时候,性能不好单向链式结构处理性能不好(一般来说,链式都不使用)。

步骤:

1.取出数组中最前的数据作为对比数据;定义低位指针和高位指针,分别是数组头部第一个数据和尾部第一个数据。

2.(1)如上图所示,我们需要右移低位指针和左移高位指针取出数据,先取出76>31,高位指针向左移动,低位指针保持不动

    (2)当高位指针移动到12位置时,12<31,将会发生交换,取出12与低位指针上的数据进行交换,如下图:

 

 

3.(1)当发生数据交换后,低位指针要开始变化,通过低位指针右移一位到68进行对比,68>31,将取出68与高位指针数据进行交换

    (2)注意:如果取出的数小于31,将继续右移低位指针,进行数据对比

 

4.进行完数据交换后,继续左移高位指针,继续将高位指针上的数据进行对比

 

 

4.当发现23<31时,继续重复以上步骤2、步骤3,进行数据交换

 

 

 

 

 

 

5.当最后高位指针和低位指针重合时,将31合并到该位置。

6.以上就是快速排序的一次分隔过程。接下来,用代码实现过程。

/**
     * 快速排序
     * @param array
     * @param begin
     * @param end
     */
    public static void quickSort(int[] array,int begin,int end){
        if(end-begin<=0) return;
        int x=array[begin];
        int low=begin;
        int high=end;
        boolean direction=true;  //标记方向,高低位指针需要左移右移
        L1:
        while(low<high){
            if(direction){      //从右往左找
                for(int i=high;i>low;i--){
                    if(array[i]<=x){
                        array[low++]=array[i];
                        high=i;
                        direction=!direction;
                        continue L1;
                    }
                }
                high=low;//未比较大小,两个指针重合
            }else{
                for(int i=low;i<high;i++){
                    if(array[i]>=x){
                        array[high--]=array[i];
                        low=i;
                        direction=!direction;
                        continue L1;
                    }
                }
                low=high;
            }
        }
        array[low]=x;   //把最后找到的值,放入中间位置
        //以上只是进行一次分隔,所以接下来,我们需要再对左右两端进行分隔操作
        quickSort(array,begin,low-1);
        quickSort(array,low+1,end);	
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值