java快速排序

用“填坑”的方法实现快速排序:
1、取出头部数字作为中值,形成初始坑;
2、从右边遍历取出小于或等于中值的数字填进1中形成坑;
3、再从左边遍历取出大于中值的数组填进2形成的坑;
4、重复2,3直到循环结束,把中值填回数组中,此时中值所在位置把原数组分割成两部分;
5、用递归方法对分割成的两部分进行排序。
:2、3步骤中,与中值相等的值要么按比中值小处理,要么按比中值大处理,要么不处理,即至多只能往一个方向填坑(可以不取出填坑)
代码如下:

//快速排序:“填坑”方法,与中值相等的按小于中值处理
import java.util.Arrays;
public class QuickSort{
    public static void quickSort(int[] a, int begin, int end){
        if(begin >= end)
            return;  
        //数组长度不小于2才需要排序
        int low = begin;
        int high = end;
        int mid = a[low];  //第一个数取出作为中值,形成左坑
        //把数组分为左右两部分,左边比中值小,右边比中值大
        while(low < high){
            //从右开始取出小于等于中值的数填左坑,形成右坑
            while(low < high && a[high] > mid){
                high = high - 1;
            }
            a[low] = a[high];
            //从左开始取大于中值的数填右坑,形成新左坑
            while(low < high && a[low] <= mid){
                low = low + 1;
            }
            a[high] = a[low];
        }
        //第一次取出的数回填使数组完整
        a[low] = mid;
        //递归完成两部分排序
        quickSort(a, begin, low - 1);
        quickSort(a, low + 1, end);
    }
    //测试实例
    public static void main(String[] args){
        int a[] = {4, 5, 1, 9, 7, 2, 3, 6, 8};
        int b[] = {1};
        int c[] = {4,3};
        int d[] = {4, 5, 4, 1, 2, 2, 3, 2, 8};
        System.out.println("原数组a = " + Arrays.toString(a));
        quickSort(a, 0, a.length - 1);
        System.out.println("快排后a = " + Arrays.toString(a));

        System.out.println("原数组b = " + Arrays.toString(b));
        quickSort(b, 0, b.length - 1);
        System.out.println("快排后b = " + Arrays.toString(b));

        System.out.println("原数组c = " + Arrays.toString(c));
        quickSort(c, 0, c.length - 1);
        System.out.println("快排后c = " + Arrays.toString(c));

        System.out.println("原数组d = " + Arrays.toString(d));
        quickSort(d, 0, d.length - 1);
        System.out.println("快排后d = " + Arrays.toString(d));
    }
}

输出:

原数组a = [4, 5, 1, 9, 7, 2, 3, 6, 8]
快排后a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
原数组b = [1]
快排后b = [1]
原数组c = [4, 3]
快排后c = [3, 4]
原数组d = [4, 5, 4, 1, 2, 2, 3, 2, 8]
快排后d = [1, 2, 2, 2, 3, 4, 4, 5, 8]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值