数组的快速排序

快速排序是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。设要排序的数组是A[1]…A[n-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。

import java.util.Arrays;

public class sx8{
    public static void main(String[] args) {
        /*
        快速排序
         */
        int[] arr={10,30,25,79,40,32,6,25};
        //上面的arr是主函数的变量
        //调用快排函数,因为快排函数涉及到分治,把数据分成左右两部分,还继续调用
        QuaiPai(arr,0,arr.length-1);
//      调用快排后,直接输出
        System.out.println(Arrays.toString(arr));

    }
    //快排需要左和右的游标,每轮都会把数据分成两部分,左部分右部分每轮数值都不一样
    //这里传入的 arr是QuaiPai中的变量,但是两个的地址相同,操作都是一个数据,这里操作后不需要返回
    public static void QuaiPai(int[] arr,int left,int right) {
        //限定函数的退出,对于函数就是return,对于循环就是break

        if(left>=right){
            return;
        }
        //记录的left0是基值的位置意思
        int left0=left;
        //设定基数值,每轮分段后每次以左边的值做为基值,每轮基值就不同了
        int baseNumber = arr[left0];
        //然后再进行比较
        while (left != right) {
            //右边的元素比基值,加右游标,右边的游标是--,再++就超出数组的界限
            System.out.println(right);
            while(arr[right]>=baseNumber && left<right){
                right--;
            }
            System.out.println("--------------");
            System.out.println(left);
            //左边的元素比基值,加左游标
            while(arr[left]<=baseNumber && left<right){
                left++;
            }
            //以上两个条件退出,证明有一个数left游标的值>baseNumber或者右边的元素<=baseNumber
            int tmp=arr[right];
            arr[right]=arr[left];
            arr[left]=tmp;
        }
        //退出游标left和 right的指示时,再把左游标和基值的位置交换,这样基值左边元素都比基值小,基值右边元素都比基值大
        int tmp=arr[left0];
        arr[left0]=arr[left];
        arr[left]=tmp;
        //执行到这里,数组被基值分成左右两部分,左边比基值小,但无序,右边比基值大,也无序
        //再次递归调用快排左边和右边

        //现在数组分裂点在left的位置,left+1到数组结尾是右边,右边使用快排

        QuaiPai(arr,left+1,arr.length-1);
        //从left0开始,到right-1

        QuaiPai(arr,left0,right-1);
    }
}

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值