快速排序

import java.util.Arrays;
import java.util.Random;

/*
 * 快速排序的简单实现
 * 由于是第一次写这个,不知道怎么制作动图,
 * 所以读者自行画图,我尽量把注释写的白话文一点
 */
public class QuickSort {
    public static void main(String[] args) throws Exception{
        //任何程序都要做各种输入的判断,异常输入的判断
        //但是这里就不用了,我们为了简化,数组已经给出,而不是让用户手动输入
        long arr[] = new long[10000] ;
        //产生100个随机数
        Random rd = new Random();
        for(int i=0;i<arr.length;i++){
            arr[i] = rd.nextInt(10000000);
        }
        System.out.println(Arrays.toString(arr));

        //这里的end下标要减一,因为arr.length是数组长度,如果不减一,下面的函数会地址越界
        System.out.println(Arrays.toString(quickSort(arr,0,arr.length-1)));
    }

    public static long[] quickSort(long[] arr, int begin, int end) throws Exception{
        if(end>begin)//这是递归的出口,如果没有这句话,程序不结束的,导致会报栈溢出错误
        {
            //这里开始调用下面的函数使用分治的思想进行排序,
            //partition方法把数组以基准的数分成 2部分,但这2部分还是无序的,所以对着2部分再调用partition的函数继续排序,
            //这样反复,就能使原数组有序了
            int position = partition(arr,begin,end);
            quickSort(arr,begin,position-1);
            quickSort(arr,position+1,end);

        }
        return arr;
    }
    //此函数就是一次(一趟)排序的函数,让数组根据中枢分成2部分,一边全部比中枢大,一边全部比中枢小
    //即此函数执行一次,参数的数组就会被分成2部分,但是2部分各自都是乱的(一般是,因为要用分治的思想去对着2部分各自在做这个函数的操作)
    public static int partition(long[] arr2, int begin, int end){
        long temp = arr2[begin];   //一般使用数组的第一个元素作为中枢(中枢就是比较对象,所有的数都和这个数比较)
        while(end>begin){
              //中枢是在begin这边选的,所以要从end那边开始和中枢比较
            while(end>begin && arr2[end]>=temp)       //如果end那边一直大于中枢,就比较下一个  
                end--;
            arr2[begin] = arr2[end]; //如果不大于,就把此值赋给begin,让从begin这头和中枢比较,
                                        //从begin的下一个开始比较,因为begin那个值已经被end覆盖了
                                        //他的原始值保存在temp中,不用担心他会丢失,因为temp中的就是中枢

            while(end>begin && arr2[begin]<temp)  //从另一头 的循环是相同的道理
                begin++;
            arr2[end] = arr2[begin];
        }
        //最后把中枢赋给begin(此时begin和end是一个位置,否则不会跳出循环)的位置
        arr2[begin]=temp;
        //返回最后begin和end停留的位置(即最后中枢的位置),是为了继续调用partition函数时使用
        return begin;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值